1/*
2 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11package org.webrtc.webrtcdemo;
12
13import android.app.Activity;
14import android.app.Fragment;
15import android.os.Bundle;
16import android.util.Log;
17import android.view.LayoutInflater;
18import android.view.View;
19import android.view.ViewGroup;
20import android.widget.CheckBox;
21import android.widget.EditText;
22import android.widget.RadioGroup;
23import android.widget.TextView;
24import java.net.InetAddress;
25import java.net.NetworkInterface;
26import java.net.SocketException;
27import java.util.Enumeration;
28
29public class SettingsMenuFragment extends Fragment
30    implements RadioGroup.OnCheckedChangeListener {
31
32  private String TAG;
33  private MenuStateProvider stateProvider;
34
35  EditText etRemoteIp;
36
37  @Override
38  public View onCreateView(LayoutInflater inflater, ViewGroup container,
39      Bundle savedInstanceState) {
40    View v = inflater.inflate(R.layout.settingsmenu, container, false);
41
42    TAG = getResources().getString(R.string.tag);
43
44    CheckBox cbVideoReceive = (CheckBox) v.findViewById(R.id.cbVideoReceive);
45    cbVideoReceive.setChecked(getEngine().receiveVideo());
46    cbVideoReceive.setOnClickListener(new View.OnClickListener() {
47        public void onClick(View checkBox) {
48          CheckBox cbVideoReceive = (CheckBox) checkBox;
49          getEngine().setReceiveVideo(cbVideoReceive.isChecked());
50          cbVideoReceive.setChecked(getEngine().receiveVideo());
51        }
52      });
53    CheckBox cbVideoSend = (CheckBox) v.findViewById(R.id.cbVideoSend);
54    cbVideoSend.setChecked(getEngine().sendVideo());
55    cbVideoSend.setOnClickListener(new View.OnClickListener() {
56        public void onClick(View checkBox) {
57          CheckBox cbVideoSend = (CheckBox) checkBox;
58          getEngine().setSendVideo(cbVideoSend.isChecked());
59          cbVideoSend.setChecked(getEngine().sendVideo());
60        }
61      });
62    CheckBox cbAudio = (CheckBox) v.findViewById(R.id.cbAudio);
63    cbAudio.setChecked(getEngine().audioEnabled());
64    cbAudio.setOnClickListener(new View.OnClickListener() {
65        public void onClick(View checkBox) {
66          CheckBox cbAudio = (CheckBox) checkBox;
67          getEngine().setAudio(cbAudio.isChecked());
68          cbAudio.setChecked(getEngine().audioEnabled());
69        }
70      });
71    boolean loopback =
72        getResources().getBoolean(R.bool.loopback_enabled_default);
73    CheckBox cbLoopback = (CheckBox) v.findViewById(R.id.cbLoopback);
74    cbLoopback.setChecked(loopback);
75    cbLoopback.setOnClickListener(new View.OnClickListener() {
76        public void onClick(View checkBox) {
77          loopbackChanged((CheckBox) checkBox);
78        }
79      });
80    etRemoteIp = (EditText) v.findViewById(R.id.etRemoteIp);
81    etRemoteIp.setOnFocusChangeListener(new View.OnFocusChangeListener() {
82        public void onFocusChange(View editText, boolean hasFocus) {
83          if (!hasFocus) {
84            getEngine().setRemoteIp(etRemoteIp.getText().toString());
85          }
86        }
87      });
88    // Has to be after remote IP as loopback changes it.
89    loopbackChanged(cbLoopback);
90    RadioGroup rRenderMechanism =
91        (RadioGroup) v.findViewById(R.id.rRenderMechanism);
92    rRenderMechanism.clearCheck();
93    if (getEngine().viewSelection() ==
94        getResources().getInteger(R.integer.openGl)) {
95      rRenderMechanism.check(R.id.rOpenGl);
96    } else if (getEngine().viewSelection() ==
97        getResources().getInteger(R.integer.surfaceView)) {
98      rRenderMechanism.check(R.id.rSurfaceView);
99    } else {
100      rRenderMechanism.check(R.id.rMediaCodec);
101    }
102    rRenderMechanism.setOnCheckedChangeListener(this);
103    return v;
104  }
105
106  @Override
107  public void onAttach(Activity activity) {
108    super.onAttach(activity);
109
110    // This makes sure that the container activity has implemented
111    // the callback interface. If not, it throws an exception.
112    try {
113      stateProvider = (MenuStateProvider) activity;
114    } catch (ClassCastException e) {
115      throw new ClassCastException(activity +
116          " must implement MenuStateProvider");
117    }
118  }
119
120  private void loopbackChanged(CheckBox cbLoopback) {
121    boolean loopback = cbLoopback.isChecked();
122    etRemoteIp.setText(loopback ? getLoopbackIPString() : getLocalIpAddress());
123    getEngine().setRemoteIp(etRemoteIp.getText().toString());
124  }
125
126  private String getLoopbackIPString() {
127    return getResources().getString(R.string.loopbackIp);
128  }
129
130  private String getLocalIpAddress() {
131    String localIp = "";
132    try {
133      for (Enumeration<NetworkInterface> en = NetworkInterface
134               .getNetworkInterfaces(); en.hasMoreElements();) {
135        NetworkInterface intf = en.nextElement();
136        for (Enumeration<InetAddress> enumIpAddr =
137                 intf.getInetAddresses();
138             enumIpAddr.hasMoreElements(); ) {
139          InetAddress inetAddress = enumIpAddr.nextElement();
140          if (!inetAddress.isLoopbackAddress()) {
141            // Set the remote ip address the same as
142            // the local ip address of the last netif
143            localIp = inetAddress.getHostAddress().toString();
144          }
145        }
146      }
147    } catch (SocketException e) {
148      Log.e(TAG, "Unable to get local IP address. Not the end of the world", e);
149    }
150    return localIp;
151  }
152
153  private MediaEngine getEngine() {
154    return stateProvider.getEngine();
155  }
156
157  public void onCheckedChanged(RadioGroup group, int checkedId) {
158    switch (checkedId) {
159      case R.id.rOpenGl:
160        getEngine().setViewSelection(
161            getResources().getInteger(R.integer.openGl));
162        break;
163      case R.id.rSurfaceView:
164        getEngine().setViewSelection(
165            getResources().getInteger(R.integer.surfaceView));
166        break;
167      case R.id.rMediaCodec:
168        getEngine().setViewSelection(
169            getResources().getInteger(R.integer.mediaCodec));
170        break;
171      default:
172        break;
173    }
174  }
175}