/**
* Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr)
* This file is part of CSipSimple.
*
* CSipSimple is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* If you own a pjsip commercial license you can also redistribute it
* and/or modify it under the terms of the GNU Lesser General Public License
* as an android library.
*
* CSipSimple is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CSipSimple. If not, see <http://www.gnu.org/licenses/>.
*/
package com.csipsimple.widgets;
import android.content.Context;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.csipsimple.R;
import com.csipsimple.api.SipProfile;
import com.csipsimple.models.Filter;
import com.csipsimple.utils.Log;
import com.csipsimple.utils.contacts.ContactsSearchAdapter;
import com.csipsimple.widgets.AccountChooserButton.OnAccountChangeListener;
import java.util.regex.Pattern;
public class EditSipUri extends LinearLayout implements TextWatcher, OnItemClickListener {
protected static final String THIS_FILE = "EditSipUri";
private AutoCompleteTextView dialUser;
private AccountChooserButton accountChooserButtonText;
private TextView domainTextHelper;
private ListView completeList;
private ContactsSearchAdapter contactsAdapter;
//private ContactsAutocompleteAdapter autoCompleteAdapter;
public EditSipUri(Context context, AttributeSet attrs) {
super(context, attrs);
setGravity(Gravity.CENTER_HORIZONTAL);
setOrientation(VERTICAL);
LayoutInflater inflater = LayoutInflater.from(context);
inflater.inflate(R.layout.edit_sip_uri, this, true);
dialUser = (AutoCompleteTextView) findViewById(R.id.dialtxt_user);
accountChooserButtonText = (AccountChooserButton) findViewById(R.id.accountChooserButtonText);
domainTextHelper = (TextView) findViewById(R.id.dialtxt_domain_helper);
completeList = (ListView) findViewById(R.id.autoCompleteList);
// Map events
accountChooserButtonText.setOnAccountChangeListener(new OnAccountChangeListener() {
@Override
public void onChooseAccount(SipProfile account) {
updateDialTextHelper();
long accId = SipProfile.INVALID_ID;
if (account != null) {
accId = account.id;
}
if(contactsAdapter != null) {
contactsAdapter.setSelectedAccount(accId);
}
}
});
dialUser.addTextChangedListener(this);
}
/* (non-Javadoc)
* @see android.view.View#onAttachedToWindow()
*/
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if(isInEditMode()) {
// Don't bind cursor in this case
return;
}
contactsAdapter = new ContactsSearchAdapter(getContext());
completeList.setAdapter(contactsAdapter);
completeList.setOnItemClickListener(this);
// autoCompleteAdapter = new ContactsAutocompleteAdapter(getContext());
// dialUser.setAdapter(autoCompleteAdapter);
}
/* (non-Javadoc)
* @see android.view.View#onDetachedFromWindow()
*/
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if(isInEditMode()) {
// Don't bind cursor in this case
return;
}
if(contactsAdapter != null) {
contactsAdapter.changeCursor(null);
}
// if(autoCompleteAdapter != null) {
// autoCompleteAdapter.changeCursor(null);
// }
}
public class ToCall {
private Long accountId;
private String callee;
public ToCall(Long acc, String uri) {
accountId = acc;
callee = uri;
}
/**
* @return the pjsipAccountId
*/
public Long getAccountId() {
return accountId;
}
/**
* @return the callee
*/
public String getCallee() {
return callee;
}
};
private void updateDialTextHelper() {
String dialUserValue = dialUser.getText().toString();
if(contactsAdapter != null) {
contactsAdapter.setSelectedText(dialUserValue);
}
accountChooserButtonText.setChangeable(TextUtils.isEmpty(dialUserValue));
SipProfile acc = accountChooserButtonText.getSelectedAccount();
if (!Pattern.matches(".*@.*", dialUserValue) && acc != null
&& acc.id > SipProfile.INVALID_ID) {
domainTextHelper.setText("@" + acc.getDefaultDomain());
} else {
domainTextHelper.setText("");
}
}
/**
* Retrieve the value of the selected sip uri
*
* @return the contact to call as a ToCall object containing account to use
* and number to call
*/
public ToCall getValue() {
String userName = dialUser.getText().toString();
String toCall = "";
Long accountToUse = null;
if (TextUtils.isEmpty(userName)) {
return null;
}
userName = userName.replaceAll("[ \t]", "");
SipProfile acc = accountChooserButtonText.getSelectedAccount();
if (acc != null) {
accountToUse = acc.id;
// If this is a sip account
if (accountToUse > SipProfile.INVALID_ID) {
if (Pattern.matches(".*@.*", userName)) {
toCall = "sip:" + userName + "";
} else if (!TextUtils.isEmpty(acc.getDefaultDomain())) {
toCall = "sip:" + userName + "@" + acc.getDefaultDomain();
} else {
toCall = "sip:" + userName;
}
} else {
toCall = userName;
}
} else {
toCall = userName;
}
return new ToCall(accountToUse, toCall);
}
public SipProfile getSelectedAccount() {
return accountChooserButtonText.getSelectedAccount();
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence newText, int arg1, int arg2, int arg3) {
updateDialTextHelper();
}
@Override
public void afterTextChanged(Editable s) {
updateDialTextHelper();
}
/**
* Reset content of the field
* @see Editable#clear()
*/
public void clear() {
dialUser.getText().clear();
}
/**
* Set the content of the field
* @param number The new content to set in the field
*/
public void setTextValue(String number) {
clear();
dialUser.getText().append(number);
}
/**
* Retrieve the underlying text field of this widget to modify it's behavior directly
* @return the underlying widget
*/
public EditText getTextField() {
return dialUser;
}
@Override
public void onItemClick(AdapterView<?> ad, View view, int position, long arg3) {
String number = (String) view.getTag();
SipProfile account = accountChooserButtonText.getSelectedAccount();
String rewritten = Filter.rewritePhoneNumber(getContext(), account.id, number);
setTextValue(rewritten);
Log.d(THIS_FILE, "Clicked contact " + number);
}
public void setShowExternals(boolean b) {
accountChooserButtonText.setShowExternals(b);
}
}