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}