ConnectActivity.java revision e3fccd4268d8e46c737f27a431c1dd263f312395
17bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org/*
27bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * libjingle
35f93d0a140515e3b8cdd1b9a4c6f5871144e5deejlmiller@webrtc.org * Copyright 2014 Google Inc.
47bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org *
57bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * Redistribution and use in source and binary forms, with or without
67bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * modification, are permitted provided that the following conditions are met:
77bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org *
87bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
97bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org *     this list of conditions and the following disclaimer.
107bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
117bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org *     this list of conditions and the following disclaimer in the documentation
127bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org *     and/or other materials provided with the distribution.
137bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org *  3. The name of the author may not be used to endorse or promote products
147bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org *     derived from this software without specific prior written permission.
157bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org *
167bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
177bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
187bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
197bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
207bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
217bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
227bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
237bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
247bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
257bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
267bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org */
277bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
287bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgpackage org.appspot.apprtc;
297bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
307bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.app.Activity;
317bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.app.AlertDialog;
327bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.content.DialogInterface;
337bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.content.Intent;
34243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.orgimport android.content.SharedPreferences;
357bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.net.Uri;
367bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.os.Bundle;
37243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.orgimport android.preference.PreferenceManager;
38243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.orgimport android.util.Log;
397bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.view.KeyEvent;
40243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.orgimport android.view.Menu;
41243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.orgimport android.view.MenuItem;
427bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.view.View;
437bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.view.View.OnClickListener;
447bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.view.inputmethod.EditorInfo;
457bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.webkit.URLUtil;
465f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport android.widget.AdapterView;
475f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport android.widget.ArrayAdapter;
487bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.widget.EditText;
495f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport android.widget.ImageButton;
505f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport android.widget.ListView;
517bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgimport android.widget.TextView;
527bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
535f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport org.json.JSONArray;
545f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.orgimport org.json.JSONException;
55470988742a2ad2edbeba3a99b86481b4fb0cd0d3perkj@webrtc.org
565eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.orgimport java.util.ArrayList;
575eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.orgimport java.util.Random;
585f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org
597bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org/**
607bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org * Handles the initial setup where the user selects which room to join.
617bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org */
627bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.orgpublic class ConnectActivity extends Activity {
635eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org  private static final String TAG = "ConnectActivity";
645eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org  private static final int CONNECTION_REQUEST = 1;
65369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org  private static boolean commandLineRun = false;
666f6ef72950b9bda79392e83d7b1495d4ff07b4a2henrik.lundin@webrtc.org
675f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ImageButton addRoomButton;
685f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ImageButton removeRoomButton;
695f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ImageButton connectButton;
705f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ImageButton connectLoopbackButton;
717bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  private EditText roomEditText;
725f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ListView roomListView;
73243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  private SharedPreferences sharedPref;
74e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefVideoCallEnabled;
75243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  private String keyprefResolution;
765f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private String keyprefFps;
77e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefVideoBitrateType;
78e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefVideoBitrateValue;
7944ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org  private String keyprefVideoCodec;
80e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefAudioBitrateType;
81e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefAudioBitrateValue;
82e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org  private String keyprefAudioCodec;
8344ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org  private String keyprefHwCodecAcceleration;
842176db343cf269a6f1faa7f0b20e8b5ad001c654henrika@webrtc.org  private String keyprefCpuUsageDetection;
85bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org  private String keyprefDisplayHud;
86a6f7ba6848302d142ba769615d12bbf77a13e6e6jiayl@webrtc.org  private String keyprefRoomServerUrl;
87243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  private String keyprefRoom;
885f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private String keyprefRoomList;
895f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ArrayList<String> roomList;
905f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private ArrayAdapter<String> adapter;
917bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
927bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  @Override
937bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  public void onCreate(Bundle savedInstanceState) {
947bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    super.onCreate(savedInstanceState);
957bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
96243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    // Get setting keys.
97243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
98243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
99e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefVideoCallEnabled = getString(R.string.pref_videocall_key);
100243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    keyprefResolution = getString(R.string.pref_resolution_key);
1015f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    keyprefFps = getString(R.string.pref_fps_key);
102e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefVideoBitrateType = getString(R.string.pref_startvideobitrate_key);
103e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefVideoBitrateValue = getString(R.string.pref_startvideobitratevalue_key);
10444ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org    keyprefVideoCodec = getString(R.string.pref_videocodec_key);
10544ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org    keyprefHwCodecAcceleration = getString(R.string.pref_hwcodec_key);
106e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefAudioBitrateType = getString(R.string.pref_startaudiobitrate_key);
107e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefAudioBitrateValue = getString(R.string.pref_startaudiobitratevalue_key);
108e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    keyprefAudioCodec = getString(R.string.pref_audiocodec_key);
1092176db343cf269a6f1faa7f0b20e8b5ad001c654henrika@webrtc.org    keyprefCpuUsageDetection = getString(R.string.pref_cpu_usage_detection_key);
110bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    keyprefDisplayHud = getString(R.string.pref_displayhud_key);
111a6f7ba6848302d142ba769615d12bbf77a13e6e6jiayl@webrtc.org    keyprefRoomServerUrl = getString(R.string.pref_room_server_url_key);
112243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    keyprefRoom = getString(R.string.pref_room_key);
1135f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    keyprefRoomList = getString(R.string.pref_room_list_key);
114243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org
1157bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    setContentView(R.layout.activity_connect);
1167bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
1177bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    roomEditText = (EditText) findViewById(R.id.room_edittext);
1187bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    roomEditText.setOnEditorActionListener(
119edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      new TextView.OnEditorActionListener() {
120edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org        @Override
121edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org        public boolean onEditorAction(
122edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org            TextView textView, int i, KeyEvent keyEvent) {
123edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org          if (i == EditorInfo.IME_ACTION_DONE) {
124edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org            addRoomButton.performClick();
125edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org            return true;
1267bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org          }
127edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org          return false;
128edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org        }
1297bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    });
1307bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    roomEditText.requestFocus();
1317bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
1325f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    roomListView = (ListView) findViewById(R.id.room_listview);
1335f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    roomListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
134470988742a2ad2edbeba3a99b86481b4fb0cd0d3perkj@webrtc.org
1355f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    addRoomButton = (ImageButton) findViewById(R.id.add_room_button);
1365f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    addRoomButton.setOnClickListener(addRoomListener);
1375f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    removeRoomButton = (ImageButton) findViewById(R.id.remove_room_button);
1385f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    removeRoomButton.setOnClickListener(removeRoomListener);
1395f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    connectButton = (ImageButton) findViewById(R.id.connect_button);
1405f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    connectButton.setOnClickListener(connectListener);
1415f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    connectLoopbackButton =
1425f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        (ImageButton) findViewById(R.id.connect_loopback_button);
1435f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    connectLoopbackButton.setOnClickListener(connectListener);
144edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org
145edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org    // If an implicit VIEW intent is launching the app, go directly to that URL.
146edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org    final Intent intent = getIntent();
1475eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org    if ("android.intent.action.VIEW".equals(intent.getAction())
1485eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org        && !commandLineRun) {
149edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      commandLineRun = true;
150bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      boolean loopback = intent.getBooleanExtra(
151bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org          CallActivity.EXTRA_LOOPBACK, false);
152bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      int runTimeMs = intent.getIntExtra(
153bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org          CallActivity.EXTRA_RUNTIME, 0);
154369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      String room = sharedPref.getString(keyprefRoom, "");
155369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      roomEditText.setText(room);
156369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      connectToRoom(loopback, runTimeMs);
157edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      return;
158edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org    }
1597bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  }
1607bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
161243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  @Override
162243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  public boolean onCreateOptionsMenu(Menu menu) {
163243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    getMenuInflater().inflate(R.menu.connect_menu, menu);
164243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    return true;
165243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  }
166243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org
167243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  @Override
168243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  public boolean onOptionsItemSelected(MenuItem item) {
169243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    // Handle presses on the action bar items.
170243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    if (item.getItemId() == R.id.action_settings) {
171243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org      Intent intent = new Intent(this, SettingsActivity.class);
172243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org      startActivity(intent);
173243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org      return true;
174243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    } else {
175243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org      return super.onOptionsItemSelected(item);
176243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    }
177243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  }
178243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org
179243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  @Override
180243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  public void onPause() {
181243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    super.onPause();
182243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    String room = roomEditText.getText().toString();
1835f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    String roomListJson = new JSONArray(roomList).toString();
184243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    SharedPreferences.Editor editor = sharedPref.edit();
185243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    editor.putString(keyprefRoom, room);
1865f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    editor.putString(keyprefRoomList, roomListJson);
187243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    editor.commit();
188243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  }
189243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org
190243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  @Override
191243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  public void onResume() {
192243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    super.onResume();
193243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    String room = sharedPref.getString(keyprefRoom, "");
194243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org    roomEditText.setText(room);
1955f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    roomList = new ArrayList<String>();
1965f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    String roomListJson = sharedPref.getString(keyprefRoomList, null);
1975f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    if (roomListJson != null) {
1985f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      try {
1995f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        JSONArray jsonArray = new JSONArray(roomListJson);
2005f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        for (int i = 0; i < jsonArray.length(); i++) {
2015f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org          roomList.add(jsonArray.get(i).toString());
2025f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        }
2035f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      } catch (JSONException e) {
2045f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        Log.e(TAG, "Failed to load room list: " + e.toString());
2055f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
2065f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
2075f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    adapter = new ArrayAdapter<String>(
2085f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        this, android.R.layout.simple_list_item_1, roomList);
2095f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    roomListView.setAdapter(adapter);
2105f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    if (adapter.getCount() > 0) {
2115f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      roomListView.requestFocus();
2125f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      roomListView.setItemChecked(0, true);
2135f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
214243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org  }
215243eb8e9af35f07befa733c86dd320f9f8b021bdglaznev@webrtc.org
216edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org  @Override
217edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org  protected void onActivityResult(
218edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      int requestCode, int resultCode, Intent data) {
219edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org    if (requestCode == CONNECTION_REQUEST && commandLineRun) {
220edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      Log.d(TAG, "Return: " + resultCode);
221edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      setResult(resultCode);
222bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      commandLineRun = false;
223edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      finish();
224edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org    }
225edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org  }
226edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org
2275f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private final OnClickListener connectListener = new OnClickListener() {
2285f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    @Override
2295f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    public void onClick(View view) {
2305f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      boolean loopback = false;
2315f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      if (view.getId() == R.id.connect_loopback_button) {
2325f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        loopback = true;
2335f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
234369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      commandLineRun = false;
235369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      connectToRoom(loopback, 0);
236369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    }
237369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org  };
238369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
239369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org  private void connectToRoom(boolean loopback, int runTimeMs) {
240369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    // Get room name (random for loopback).
241bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    String roomId;
242369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    if (loopback) {
243bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      roomId = Integer.toString((new Random()).nextInt(100000000));
244369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    } else {
245bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      roomId = getSelectedItem();
246bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      if (roomId == null) {
247bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        roomId = roomEditText.getText().toString();
2486f6ef72950b9bda79392e83d7b1495d4ff07b4a2henrik.lundin@webrtc.org      }
249369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    }
250369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
251bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    String roomUrl = sharedPref.getString(
252a6f7ba6848302d142ba769615d12bbf77a13e6e6jiayl@webrtc.org        keyprefRoomServerUrl,
253a6f7ba6848302d142ba769615d12bbf77a13e6e6jiayl@webrtc.org        getString(R.string.pref_room_server_url_default));
254369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
255e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    // Video call enabled flag.
256e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    boolean videoCallEnabled = sharedPref.getBoolean(keyprefVideoCallEnabled,
257e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org        Boolean.valueOf(getString(R.string.pref_videocall_default)));
258e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org
259e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    // Get default codecs.
26044ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org    String videoCodec = sharedPref.getString(keyprefVideoCodec,
26144ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org        getString(R.string.pref_videocodec_default));
262e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    String audioCodec = sharedPref.getString(keyprefAudioCodec,
263e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org        getString(R.string.pref_audiocodec_default));
26444ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org
265369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    // Check HW codec flag.
26644ae4c8b07cdf06d20d5042326b90ec9b466b664glaznev@webrtc.org    boolean hwCodec = sharedPref.getBoolean(keyprefHwCodecAcceleration,
267369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        Boolean.valueOf(getString(R.string.pref_hwcodec_default)));
268369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
269bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    // Get video resolution from settings.
270bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    int videoWidth = 0;
271bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    int videoHeight = 0;
272369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    String resolution = sharedPref.getString(keyprefResolution,
273369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        getString(R.string.pref_resolution_default));
274369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    String[] dimensions = resolution.split("[ x]+");
275369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    if (dimensions.length == 2) {
276369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      try {
277bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        videoWidth = Integer.parseInt(dimensions[0]);
278bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        videoHeight = Integer.parseInt(dimensions[1]);
279369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      } catch (NumberFormatException e) {
280bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        videoWidth = 0;
281bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        videoHeight = 0;
282369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        Log.e(TAG, "Wrong video resolution setting: " + resolution);
2835f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
284369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    }
285369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
286bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    // Get camera fps from settings.
287bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    int cameraFps = 0;
288369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    String fps = sharedPref.getString(keyprefFps,
289369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        getString(R.string.pref_fps_default));
290369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    String[] fpsValues = fps.split("[ x]+");
291369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    if (fpsValues.length == 2) {
292369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      try {
293bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        cameraFps = Integer.parseInt(fpsValues[0]);
294369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      } catch (NumberFormatException e) {
295369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        Log.e(TAG, "Wrong camera fps setting: " + fps);
2965f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
297369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    }
298369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
299e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    // Get video and audio start bitrate.
300e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    int videoStartBitrate = 0;
301e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    String bitrateTypeDefault = getString(
302e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org        R.string.pref_startvideobitrate_default);
303369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    String bitrateType = sharedPref.getString(
304e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org        keyprefVideoBitrateType, bitrateTypeDefault);
305e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    if (!bitrateType.equals(bitrateTypeDefault)) {
306e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      String bitrateValue = sharedPref.getString(keyprefVideoBitrateValue,
307e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org          getString(R.string.pref_startvideobitratevalue_default));
308e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      videoStartBitrate = Integer.parseInt(bitrateValue);
309e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    }
310e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    int audioStartBitrate = 0;
311e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    bitrateTypeDefault = getString(R.string.pref_startaudiobitrate_default);
312e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org    bitrateType = sharedPref.getString(
313e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org        keyprefAudioBitrateType, bitrateTypeDefault);
314369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    if (!bitrateType.equals(bitrateTypeDefault)) {
315e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      String bitrateValue = sharedPref.getString(keyprefAudioBitrateValue,
316e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org          getString(R.string.pref_startaudiobitratevalue_default));
317e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      audioStartBitrate = Integer.parseInt(bitrateValue);
318369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    }
319369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
320369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    // Test if CpuOveruseDetection should be disabled. By default is on.
321369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    boolean cpuOveruseDetection = sharedPref.getBoolean(
322369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        keyprefCpuUsageDetection,
323369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org        Boolean.valueOf(
324369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org            getString(R.string.pref_cpu_usage_detection_default)));
325bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org
326bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    // Check statistics display option.
327bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    boolean displayHud = sharedPref.getBoolean(keyprefDisplayHud,
328bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org        Boolean.valueOf(getString(R.string.pref_displayhud_default)));
329369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org
330369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org    // Start AppRTCDemo activity.
331bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    Log.d(TAG, "Connecting to room " + roomId + " at URL " + roomUrl);
332bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org    if (validateUrl(roomUrl)) {
333bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      Uri uri = Uri.parse(roomUrl);
334bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      Intent intent = new Intent(this, CallActivity.class);
335369746bcb8daa10dc2686b6317b51e4442a9b9feglaznev@webrtc.org      intent.setData(uri);
336bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_ROOMID, roomId);
337bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_LOOPBACK, loopback);
338e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEO_CALL, videoCallEnabled);
339bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEO_WIDTH, videoWidth);
340bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEO_HEIGHT, videoHeight);
341bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEO_FPS, cameraFps);
342e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEO_BITRATE, videoStartBitrate);
343e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_VIDEOCODEC, videoCodec);
344e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_HWCODEC_ENABLED, hwCodec);
345e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_AUDIO_BITRATE, audioStartBitrate);
346e3fccd4268d8e46c737f27a431c1dd263f312395glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_AUDIOCODEC, audioCodec);
347bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_CPUOVERUSE_DETECTION,
348bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org          cpuOveruseDetection);
349bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_DISPLAY_HUD, displayHud);
350bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_CMDLINE, commandLineRun);
351bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org      intent.putExtra(CallActivity.EXTRA_RUNTIME, runTimeMs);
352bc40324d9c673f5ba4df78590d928be3b9c62418glaznev@webrtc.org
353edc6e57a92d2b366871f4c2d2e926748326017b9glaznev@webrtc.org      startActivityForResult(intent, CONNECTION_REQUEST);
3547bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    }
3557bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  }
3567bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
3577bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  private boolean validateUrl(String url) {
3585eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org    if (URLUtil.isHttpsUrl(url) || URLUtil.isHttpUrl(url)) {
3597bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org      return true;
3605eb71eb4f470bac0cbae0e1be4db8c83bc16fcd9jiayl@webrtc.org    }
3617bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org
3627bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    new AlertDialog.Builder(this)
3637bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org        .setTitle(getText(R.string.invalid_url_title))
3647bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org        .setMessage(getString(R.string.invalid_url_text, url))
3657bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org        .setCancelable(false)
3667bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org        .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() {
3677bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org            public void onClick(DialogInterface dialog, int id) {
3687bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org              dialog.cancel();
3697bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org            }
3707bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org          }).create().show();
3717bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org    return false;
3727bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org  }
3735f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org
3745f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private final OnClickListener addRoomListener = new OnClickListener() {
3755f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    @Override
3765f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    public void onClick(View view) {
3775f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      String newRoom = roomEditText.getText().toString();
3785f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      if (newRoom.length() > 0 && !roomList.contains(newRoom)) {
3795f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        adapter.add(newRoom);
3805f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        adapter.notifyDataSetChanged();
3815f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
3825f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
3835f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  };
3845f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org
3855f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private final OnClickListener removeRoomListener = new OnClickListener() {
3865f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    @Override
3875f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    public void onClick(View view) {
3885f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      String selectedRoom = getSelectedItem();
3895f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      if (selectedRoom != null) {
3905f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        adapter.remove(selectedRoom);
3915f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        adapter.notifyDataSetChanged();
3925f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
3935f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
3945f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  };
3955f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org
3965f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  private String getSelectedItem() {
3975f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    int position = AdapterView.INVALID_POSITION;
3985f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    if (roomListView.getCheckedItemCount() > 0 && adapter.getCount() > 0) {
3995f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      position = roomListView.getCheckedItemPosition();
4005f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      if (position >= adapter.getCount()) {
4015f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org        position = AdapterView.INVALID_POSITION;
4025f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      }
4035f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
4045f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    if (position != AdapterView.INVALID_POSITION) {
4055f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      return adapter.getItem(position);
4065f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    } else {
4075f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org      return null;
4085f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org    }
4095f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org  }
4105f38c8d1b8e842652e55410333870acfc5395ea6glaznev@webrtc.org
4117bb4a9881df1cd8b26391d9f15ef31117396ff19glaznev@webrtc.org}
412