/**
* 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.ui.filters;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import com.csipsimple.R;
import com.csipsimple.api.SipManager;
import com.csipsimple.api.SipProfile;
import com.csipsimple.models.Filter;
import com.csipsimple.models.Filter.RegExpRepresentation;
import com.csipsimple.utils.Log;
public class EditFilter extends Activity implements OnItemSelectedListener, TextWatcher {
private static final String THIS_FILE = "EditFilter";
private Long filterId;
private Filter filter;
private Button saveButton;
private long accountId;
private EditText replaceTextEditor;
private Spinner actionSpinner;
private EditText matchesTextEditor;
// private View matchesContainer;
private View replaceContainer;
private Spinner replaceSpinner;
private Spinner matcherSpinner;
private boolean initMatcherSpinner;
private boolean initReplaceSpinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
//Get back the concerned account and if any set the current (if not a new account is created)
Intent intent = getIntent();
filterId = intent.getLongExtra(Intent.EXTRA_UID, -1);
accountId = intent.getLongExtra(Filter.FIELD_ACCOUNT, SipProfile.INVALID_ID);
if(accountId == SipProfile.INVALID_ID) {
Log.e(THIS_FILE, "Invalid account");
finish();
}
filter = Filter.getFilterFromDbId(this, filterId, Filter.FULL_PROJ);
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_filter);
// Bind view objects
actionSpinner = (Spinner) findViewById(R.id.filter_action);
matcherSpinner = (Spinner) findViewById(R.id.matcher_type);
replaceSpinner = (Spinner) findViewById(R.id.replace_type);
replaceTextEditor = (EditText) findViewById(R.id.filter_replace);
matchesTextEditor = (EditText) findViewById(R.id.filter_matches);
//Bind containers objects
// matchesContainer = (View) findViewById(R.id.matcher_block);
replaceContainer = (View) findViewById(R.id.replace_block);
actionSpinner.setOnItemSelectedListener(this);
matcherSpinner.setOnItemSelectedListener(this);
initMatcherSpinner = false;
replaceSpinner.setOnItemSelectedListener(this);
initReplaceSpinner = false;
matchesTextEditor.addTextChangedListener(this);
replaceTextEditor.addTextChangedListener(this);
// Bind buttons to their actions
Button bt = (Button) findViewById(R.id.cancel_bt);
bt.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//TODO : clean prefs
setResult(RESULT_CANCELED, getIntent());
finish();
}
});
saveButton = (Button) findViewById(R.id.save_bt);
saveButton.setEnabled(false);
saveButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
saveFilter();
setResult(RESULT_OK, getIntent());
finish();
}
});
fillLayout();
checkFormValidity();
}
private void saveFilter() {
//Update filter object
filter.account = (int) accountId;
filter.action = Filter.getActionForPosition(actionSpinner.getSelectedItemPosition());
RegExpRepresentation repr = new RegExpRepresentation();
//Matcher
repr.type = Filter.getMatcherForPosition(matcherSpinner.getSelectedItemPosition());
repr.fieldContent = matchesTextEditor.getText().toString();
filter.setMatcherRepresentation(repr);
//Rewriter
if(filter.action == Filter.ACTION_REPLACE) {
repr.fieldContent = replaceTextEditor.getText().toString();
repr.type = Filter.getReplaceForPosition(replaceSpinner.getSelectedItemPosition());
filter.setReplaceRepresentation(repr);
}else if(filter.action == Filter.ACTION_AUTO_ANSWER){
filter.replacePattern = replaceTextEditor.getText().toString();
}else{
filter.replacePattern = "";
}
//Save
if(filterId < 0) {
Cursor currentCursor = getContentResolver().query(SipManager.FILTER_URI, new String[] {Filter._ID},
Filter.FIELD_ACCOUNT + "=?",
new String[] {
filter.account.toString()
}, null);
filter.priority = 0;
if(currentCursor != null) {
filter.priority = currentCursor.getCount();
currentCursor.close();
}
getContentResolver().insert(SipManager.FILTER_URI, filter.getDbContentValues());
}else {
getContentResolver().update(ContentUris.withAppendedId(SipManager.FILTER_ID_URI_BASE, filterId), filter.getDbContentValues(), null, null);
}
}
private void fillLayout() {
//Set action
actionSpinner.setSelection(Filter.getPositionForAction(filter.action));
RegExpRepresentation repr = filter.getRepresentationForMatcher();
//Set matcher - selection must be done first since raise on item change listener
matcherSpinner.setSelection(Filter.getPositionForMatcher(repr.type));
matchesTextEditor.setText(repr.fieldContent);
//Set replace
repr = filter.getRepresentationForReplace();
replaceSpinner.setSelection(Filter.getPositionForReplace(repr.type));
replaceTextEditor.setText(repr.fieldContent);
}
private void checkFormValidity() {
boolean isValid = true;
int action = Filter.getActionForPosition(actionSpinner.getSelectedItemPosition());
if(TextUtils.isEmpty(matchesTextEditor.getText().toString()) &&
matcherNeedsText() ){
isValid = false;
}
if(action == Filter.ACTION_AUTO_ANSWER) {
if(!TextUtils.isEmpty(replaceTextEditor.getText().toString())) {
try{
Integer.parseInt(replaceTextEditor.getText().toString());
}catch(NumberFormatException e) {
isValid = false;
}
}
}
saveButton.setEnabled(isValid);
}
@Override
public void onItemSelected(AdapterView<?> spinner, View arg1, int arg2, long arg3) {
int spinnerId = spinner.getId();
if (spinnerId == R.id.filter_action) {
int action = Filter.getActionForPosition(actionSpinner.getSelectedItemPosition()) ;
if(action == Filter.ACTION_REPLACE || action == Filter.ACTION_AUTO_ANSWER) {
replaceContainer.setVisibility(View.VISIBLE);
if(action == Filter.ACTION_REPLACE) {
replaceSpinner.setVisibility(View.VISIBLE);
replaceTextEditor.setHint("");
}else {
replaceSpinner.setVisibility(View.GONE);
replaceTextEditor.setHint(R.string.optional_sip_code);
}
}else {
replaceContainer.setVisibility(View.GONE);
}
} else if (spinnerId == R.id.matcher_type) {
if(initMatcherSpinner) {
matchesTextEditor.setText("");
}else {
initMatcherSpinner = true;
}
} else if (spinnerId == R.id.replace_type) {
if(initReplaceSpinner) {
replaceTextEditor.setText("");
}else {
initReplaceSpinner = true;
}
}
matchesTextEditor.setVisibility(matcherNeedsText() ? View.VISIBLE : View.GONE);
checkFormValidity();
}
private boolean matcherNeedsText() {
int fmatcher = Filter.getMatcherForPosition(matcherSpinner.getSelectedItemPosition() );
return fmatcher != Filter.MATCHER_ALL &&
fmatcher != Filter.MATCHER_BLUETOOTH &&
fmatcher != Filter.MATCHER_CALLINFO_AUTOREPLY;
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
checkFormValidity();
}
@Override
public void afterTextChanged(Editable s) {
// Nothing to do
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// Nothing to do
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
checkFormValidity();
}
}