Skip to content

Commit c8d2a6a

Browse files
committed
Use data binding library for add server activity.
1 parent a8e3027 commit c8d2a6a

8 files changed

Lines changed: 491 additions & 147 deletions

File tree

Lines changed: 9 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
package com.paulds.simpleftp.presentation.activities;
22

3+
import android.databinding.DataBindingUtil;
34
import android.support.v7.app.AppCompatActivity;
45
import android.os.Bundle;
6+
import android.support.v7.widget.LinearLayoutManager;
57
import android.view.View;
68
import android.widget.EditText;
79
import android.widget.ImageButton;
810
import android.widget.Switch;
911

1012
import com.paulds.simpleftp.R;
1113
import com.paulds.simpleftp.data.entities.FtpServer;
14+
import com.paulds.simpleftp.databinding.ActivityAddServerBinding;
15+
import com.paulds.simpleftp.databinding.ActivityListFileBinding;
1216
import com.paulds.simpleftp.presentation.AndroidApplication;
17+
import com.paulds.simpleftp.presentation.model.AddServerViewModel;
18+
import com.paulds.simpleftp.presentation.model.ListFileViewModel;
1319

1420
/**
1521
* Activity which allows to add a new FTP server.
@@ -25,60 +31,9 @@ public class AddServerActivity extends AppCompatActivity {
2531
@Override
2632
protected void onCreate(Bundle savedInstanceState) {
2733
super.onCreate(savedInstanceState);
28-
setContentView(R.layout.activity_add_server);
2934

30-
ImageButton ibCreate = (ImageButton) findViewById(R.id.AddServer_ibCreate);
31-
final EditText etName = (EditText) findViewById(R.id.AddServer_etName);
32-
final EditText etHost = (EditText) findViewById(R.id.AddServer_etHost);
33-
final EditText etPort = (EditText) findViewById(R.id.AddServer_etPort);
34-
final Switch swAnonymous = (Switch) findViewById(R.id.AddServer_swAnonymous);
35-
final EditText etLogin = (EditText) findViewById(R.id.AddServer_etLogin);
36-
final EditText etPassword = (EditText) findViewById(R.id.AddServer_etPassword);
37-
38-
ibCreate.setOnClickListener(new View.OnClickListener() {
39-
@Override
40-
public void onClick(View v) {
41-
boolean error = false;
42-
43-
if(etName.getText().toString().isEmpty()) {
44-
etName.setError("Please fill a name for this server.");
45-
error = true;
46-
}
47-
48-
if(etHost.getText().toString().isEmpty()) {
49-
etHost.setError("Please fill the server host.");
50-
error = true;
51-
}
52-
53-
if(!swAnonymous.isChecked()) {
54-
if(etLogin.getText().toString().isEmpty()) {
55-
etLogin.setError("Please fill the login for FTP connection.");
56-
error = true;
57-
}
58-
59-
if(etPassword.getText().toString().isEmpty()) {
60-
etPassword.setError("Please fill the password for FTP connection.");
61-
error = true;
62-
}
63-
}
64-
65-
if(error) return;
66-
67-
FtpServer server = new FtpServer();
68-
69-
server.setName(etName.getText().toString());
70-
server.setHost(etHost.getText().toString());
71-
server.setPort(etPort.getText().toString() != null
72-
? Integer.parseInt(etPort.getText().toString())
73-
: 21);
74-
server.setIsAnonymous(swAnonymous.isChecked());
75-
server.setLogin(etLogin.getText().toString());
76-
server.setPassword(etPassword.getText().toString());
77-
78-
AndroidApplication.getRepository().getServerRepository().addServer(server);
79-
80-
AddServerActivity.this.finish();
81-
}
82-
});
35+
ActivityAddServerBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_add_server);
36+
AddServerViewModel viewModel = new AddServerViewModel(this);
37+
binding.setModel(viewModel);
8338
}
8439
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.paulds.simpleftp.presentation.binders;
2+
3+
import android.databinding.BaseObservable;
4+
import android.databinding.BindingAdapter;
5+
import android.databinding.ObservableField;
6+
import android.text.Editable;
7+
import android.text.TextWatcher;
8+
import android.util.Pair;
9+
import android.widget.CompoundButton;
10+
import android.widget.EditText;
11+
import android.widget.Switch;
12+
13+
import com.paulds.simpleftp.presentation.model.FieldViewModel;
14+
15+
/**
16+
* Class used to defined bindings used in forms views.
17+
*
18+
* @author Paul-DS
19+
*/
20+
public class FormBindings {
21+
/**
22+
* Binding method for EditText
23+
* @param view The EditText widget.
24+
* @param observable The field value.
25+
*/
26+
@BindingAdapter("binding")
27+
public static void bindEditText(EditText view, final FieldViewModel<String> observable) {
28+
if (view.getTag() == null) {
29+
view.setTag(true);
30+
31+
view.addTextChangedListener(new TextWatcher() {
32+
@Override
33+
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
34+
35+
}
36+
37+
@Override
38+
public void onTextChanged(CharSequence s, int start, int before, int count) {
39+
observable.set(s.toString());
40+
}
41+
42+
@Override
43+
public void afterTextChanged(Editable s) {
44+
45+
}
46+
});
47+
}
48+
49+
String newValue = observable.get();
50+
if (!view.getText().toString().equals(newValue)) {
51+
view.setText(newValue);
52+
}
53+
54+
String newError = observable.getError();
55+
if (view.getError() != newError) {
56+
view.setError(newError);
57+
}
58+
}
59+
60+
/**
61+
* Binding method for Switch
62+
* @param view The Switch widget.
63+
* @param observable The field value.
64+
*/
65+
@BindingAdapter("binding")
66+
public static void bindSwitch(Switch view, final FieldViewModel<Boolean> observable) {
67+
if (view.getTag() == null) {
68+
view.setTag(true);
69+
view.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
70+
@Override
71+
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
72+
observable.set(isChecked);
73+
}
74+
});
75+
}
76+
77+
boolean newValue = observable.get() == null ? false : observable.get().booleanValue();
78+
if (view.isChecked() != newValue) {
79+
view.setChecked(newValue);
80+
}
81+
82+
String newError = observable.getError();
83+
if (view.getError() != newError) {
84+
view.setError(newError);
85+
}
86+
}
87+
}
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package com.paulds.simpleftp.presentation.model;
2+
3+
import android.app.Activity;
4+
import android.content.Context;
5+
import android.content.Intent;
6+
import android.databinding.BaseObservable;
7+
import android.databinding.Bindable;
8+
import android.databinding.ObservableArrayList;
9+
import android.databinding.ObservableBoolean;
10+
import android.databinding.ObservableField;
11+
import android.databinding.ObservableInt;
12+
import android.text.TextUtils;
13+
import android.view.View;
14+
15+
import com.paulds.simpleftp.data.entities.FtpServer;
16+
import com.paulds.simpleftp.presentation.AndroidApplication;
17+
import com.paulds.simpleftp.presentation.activities.ListServerActivity;
18+
19+
/**
20+
* Model for the FTP server creation view.
21+
*
22+
* @author Paul-DS
23+
*/
24+
public class AddServerViewModel extends FormViewModel {
25+
/**
26+
* The activity context.
27+
*/
28+
private Activity context;
29+
30+
/**
31+
* The server name.
32+
*/
33+
public FieldViewModel<String> name;
34+
35+
/**
36+
* The server host.
37+
*/
38+
public FieldViewModel<String> host;
39+
40+
/**
41+
* The server port.
42+
*/
43+
public FieldViewModel<String> port;
44+
45+
/**
46+
* A value indicating whether the connection must be anonymous.
47+
*/
48+
public FieldViewModel<Boolean> isAnonymous;
49+
50+
/**
51+
* The login used to connect the server.
52+
*/
53+
public FieldViewModel<String> login;
54+
55+
/**
56+
* The password used to connect the server.
57+
*/
58+
public FieldViewModel<String> password;
59+
60+
/**
61+
* Default constructor.
62+
* @param context The context of the current activity.
63+
*/
64+
public AddServerViewModel(Activity context) {
65+
this.context = context;
66+
this.name = new FieldViewModel<String>(){
67+
@Override
68+
public void onValidate() {
69+
this.setError(this.get() == null || this.get().isEmpty()
70+
? "Please fill a name for this server."
71+
: null);
72+
}
73+
};
74+
75+
this.host = new FieldViewModel<String>(){
76+
@Override
77+
public void onValidate() {
78+
this.setError(this.get() == null || this.get().isEmpty()
79+
? "Please fill the server host."
80+
: null);
81+
}
82+
};
83+
84+
this.port = new FieldViewModel<String>("21"){
85+
@Override
86+
public void onValidate() {
87+
this.setError(!TextUtils.isDigitsOnly(this.get()) ? "Incorrect port." : null);
88+
}
89+
};
90+
91+
this.isAnonymous = new FieldViewModel<Boolean>();
92+
93+
this.login = new FieldViewModel<String>(){
94+
@Override
95+
public void onValidate() {
96+
this.setError((isAnonymous.get() != null && isAnonymous.get().booleanValue()) && (this.get() == null || this.get().isEmpty())
97+
? "Please fill the login for FTP connection."
98+
: null);
99+
}
100+
};
101+
102+
this.password = new FieldViewModel<String>(){
103+
@Override
104+
public void onValidate() {
105+
this.setError((isAnonymous.get() != null && isAnonymous.get().booleanValue()) && (this.get() == null || this.get().isEmpty())
106+
? "Please fill the password for FTP connection."
107+
: null);
108+
}
109+
};
110+
}
111+
112+
/**
113+
* Create the server.
114+
* @param view The current view
115+
*/
116+
public void createServer(View view) {
117+
if(this.validate())
118+
{
119+
FtpServer server = new FtpServer();
120+
121+
server.setName(this.name.get());
122+
server.setHost(this.host.get());
123+
server.setPort(TextUtils.isDigitsOnly(this.port.get()) ? Integer.parseInt(this.port.get()) : 21);
124+
server.setIsAnonymous(this.isAnonymous.get());
125+
server.setLogin(this.login.get());
126+
server.setPassword(this.password.get());
127+
128+
AndroidApplication.getRepository().getServerRepository().addServer(server);
129+
130+
this.context.finish();
131+
}
132+
}
133+
}

0 commit comments

Comments
 (0)