diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 240fd14d0152..9501d46e8e72 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -44,6 +44,12 @@
android:name="android.support.PARENT_ACTIVITY"
android:value=".views.MainActivity"/>
+
+
+
diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/fragments/HomeFragment.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/fragments/HomeFragment.java
index 7c41a3f188a2..8382be1319b6 100644
--- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/fragments/HomeFragment.java
+++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/fragments/HomeFragment.java
@@ -12,6 +12,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
+
import com.afollestad.materialdialogs.MaterialDialog;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
@@ -81,7 +82,7 @@ public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] hea
if (htmlNoParsed.contains("Incorrect user name or password.") || htmlNoParsed.contains("See you soon!")) {
editor.putString("user", "");
editor.putString("pass", "");
- editor.commit();
+ editor.apply();
new MaterialDialog.Builder(getActivity())
.title(R.string.alert_dialog_warning_title)
.content(R.string.alert_dialog_warning_msg_user)
diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/fragments/UserFragment.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/fragments/UserFragment.java
deleted file mode 100644
index 86f18ab34c4e..000000000000
--- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/fragments/UserFragment.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package openfoodfacts.github.scrachx.openfood.fragments;
-
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.net.Uri;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.loopj.android.http.RequestParams;
-
-import butterknife.Bind;
-import butterknife.OnClick;
-import openfoodfacts.github.scrachx.openfood.R;
-import openfoodfacts.github.scrachx.openfood.models.FoodUserClientUsage;
-import openfoodfacts.github.scrachx.openfood.utils.Utils;
-
-public class UserFragment extends BaseFragment {
-
- @Bind(R.id.editTextLogin) EditText login;
- @Bind(R.id.editTextPass) EditText pass;
- @Bind(R.id.textInfoLogin) TextView infoLogin;
- @Bind(R.id.buttonSave) Button save;
- @Bind(R.id.buttonCreateAccount) Button signup;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- return createView(inflater, container, R.layout.fragment_user);
- }
-
- @Override
- public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
-
- SharedPreferences settings = getContext().getSharedPreferences("login", 0);
-
- login.setSelected(false);
- pass.setSelected(false);
-
- String loginS = settings.getString("user", "");
- String passS = settings.getString("pass", "");
-
- if (loginS.isEmpty() && passS.isEmpty()) {
- infoLogin.setText(R.string.txtInfoLoginNo);
- } else {
- infoLogin.setText(R.string.txtInfoLoginOk);
- }
-
- login.setText(loginS);
- pass.setText(passS);
- }
-
- @OnClick(R.id.buttonSave)
- protected void onSaveUser() {
- SharedPreferences settings = getContext().getSharedPreferences("login", 0);
- if(!login.getText().toString().isEmpty() && !pass.getText().toString().isEmpty()) {
- RequestParams params = new RequestParams();
- params.put("user_id", login.getText().toString());
- params.put("password", pass.getText().toString());
- params.put(".submit", "Sign-in");
- FoodUserClientUsage api = new FoodUserClientUsage();
- api.getLoggedIn(params, getContext(), getActivity(), settings, save, login, pass, infoLogin);
- } else {
- Toast.makeText(getContext(), R.string.msg_input_empty, Toast.LENGTH_LONG).show();
- }
- }
-
- @OnClick(R.id.buttonCreateAccount)
- protected void onCreateUser() {
- Intent browser = new Intent(Intent.ACTION_VIEW);
- browser.setData(Uri.parse(Utils.getUriByCurrentLanguage() + "cgi/user.pl"));
- startActivity(browser);
- }
-
-
-}
diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/FoodUserClientUsage.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/FoodUserClientUsage.java
index 17ae4b7b3fa7..631f7772b41a 100644
--- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/FoodUserClientUsage.java
+++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/models/FoodUserClientUsage.java
@@ -1,26 +1,23 @@
package openfoodfacts.github.scrachx.openfood.models;
import android.app.Activity;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.widget.Button;
-import android.widget.EditText;
import android.widget.ListView;
-import android.widget.TextView;
import android.widget.Toast;
-import com.loopj.android.http.AsyncHttpResponseHandler;
+
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;
+
import net.steamcrafted.loadtoast.LoadToast;
+
import org.json.JSONException;
import org.json.JSONObject;
+
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import openfoodfacts.github.scrachx.openfood.R;
import openfoodfacts.github.scrachx.openfood.network.FoodUserClient;
-import openfoodfacts.github.scrachx.openfood.utils.Utils;
import openfoodfacts.github.scrachx.openfood.views.adapters.SaveListAdapter;
public class FoodUserClientUsage {
@@ -234,59 +231,4 @@ public void onRetry ( int retryNo){
}
});
}
-
- public void getLoggedIn(RequestParams params, final Context context, final Activity activity, final SharedPreferences shpref, final Button save,
- final EditText login, final EditText pass, final TextView infoLogin) {
- FoodUserClient.post("/cgi/session.pl", params, new AsyncHttpResponseHandler() {
-
- LoadToast lt = new LoadToast(context);
-
- @Override
- public void onStart() {
- super.onStart();
- save.setClickable(false);
- lt.setText(context.getString(R.string.toast_retrieving));
- lt.setBackgroundColor(context.getResources().getColor(R.color.indigo_600));
- lt.setTextColor(context.getResources().getColor(R.color.white));
- lt.show();
- }
-
- @Override
- public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody) {
- SharedPreferences.Editor editor = shpref.edit();
- String htmlNoParsed = new String(responseBody);
- if (htmlNoParsed.contains("Incorrect user name or password.") || htmlNoParsed.contains("See you soon!")) {
- lt.error();
- Toast.makeText(context, context.getString(R.string.errorLogin), Toast.LENGTH_LONG).show();
- login.setText("");
- pass.setText("");
- editor.putString("user", "");
- editor.putString("pass", "");
- editor.apply();
- infoLogin.setText(R.string.txtInfoLoginNo);
- } else {
- lt.success();
- Toast.makeText(context, context.getResources().getText(R.string.txtToastSaved), Toast.LENGTH_LONG).show();
- editor.putString("user", login.getText().toString());
- editor.putString("pass", pass.getText().toString());
- editor.apply();
- infoLogin.setText(R.string.txtInfoLoginOk);
- }
- Utils.hideKeyboard(activity);
- }
-
- @Override
- public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error) {
- Toast.makeText(context, context.getString(R.string.errorWeb), Toast.LENGTH_LONG).show();
- lt.error();
- Utils.hideKeyboard(activity);
- }
-
- @Override
- public void onFinish() {
- super.onFinish();
- save.setClickable(true);
- }
- });
- }
}
\ No newline at end of file
diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/LoginActivity.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/LoginActivity.java
new file mode 100644
index 000000000000..4669be3d5112
--- /dev/null
+++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/LoginActivity.java
@@ -0,0 +1,130 @@
+package openfoodfacts.github.scrachx.openfood.views;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.loopj.android.http.AsyncHttpResponseHandler;
+import com.loopj.android.http.RequestParams;
+
+import net.steamcrafted.loadtoast.LoadToast;
+
+import butterknife.Bind;
+import butterknife.OnClick;
+import openfoodfacts.github.scrachx.openfood.R;
+import openfoodfacts.github.scrachx.openfood.network.FoodUserClient;
+import openfoodfacts.github.scrachx.openfood.utils.Utils;
+
+/**
+ * A login screen that offers login via login/password.
+ */
+public class LoginActivity extends BaseActivity {
+
+ @Bind(R.id.editTextLogin) EditText loginView;
+ @Bind(R.id.editTextPass) EditText passwordView;
+ @Bind(R.id.textInfoLogin) TextView infoLogin;
+ @Bind(R.id.buttonSave) Button save;
+ @Bind(R.id.buttonCreateAccount) Button signup;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_login);
+ }
+
+ @OnClick(R.id.buttonCreateAccount)
+ protected void onCreateUser() {
+ Intent browser = new Intent(Intent.ACTION_VIEW);
+ browser.setData(Uri.parse(Utils.getUriByCurrentLanguage() + "cgi/user.pl"));
+ startActivity(browser);
+ }
+
+ @OnClick(R.id.buttonSave)
+ protected void attemptLogin() {
+ String login = this.loginView.getText().toString();
+ String password = passwordView.getText().toString();
+
+ if (!(password.length() > 6)) {
+ passwordView.setError(getString(R.string.error_invalid_password));
+ passwordView.requestFocus();
+ return;
+ }
+
+ if (TextUtils.isEmpty(login)) {
+ loginView.setError(getString(R.string.error_field_required));
+ loginView.requestFocus();
+ return;
+ }
+
+ RequestParams requestParams = new RequestParams();
+ requestParams.put("user_id", login);
+ requestParams.put("password", password);
+ requestParams.put(".submit", "Sign-in");
+
+ final Activity context = this;
+
+ FoodUserClient.post("/cgi/session.pl", requestParams, new AsyncHttpResponseHandler() {
+
+ LoadToast lt = new LoadToast(context);
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ save.setClickable(false);
+ lt.setText(context.getString(R.string.toast_retrieving));
+ lt.setBackgroundColor(context.getResources().getColor(R.color.indigo_600));
+ lt.setTextColor(context.getResources().getColor(R.color.white));
+ lt.show();
+ }
+
+ @Override
+ public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody) {
+ SharedPreferences settings = context.getSharedPreferences("login", 0);
+ SharedPreferences.Editor editor = settings.edit();
+ String htmlNoParsed = new String(responseBody);
+
+ if (htmlNoParsed.contains("Incorrect user name or password.") || htmlNoParsed.contains("See you soon!")) {
+ lt.error();
+ Toast.makeText(context, context.getString(R.string.errorLogin), Toast.LENGTH_LONG).show();
+ loginView.setText("");
+ passwordView.setText("");
+ editor.putString("user", "");
+ editor.putString("pass", "");
+ editor.apply();
+ infoLogin.setText(R.string.txtInfoLoginNo);
+ } else {
+ lt.success();
+ Toast.makeText(context, context.getResources().getText(R.string.txtToastSaved), Toast.LENGTH_LONG).show();
+ editor.putString("user", loginView.getText().toString());
+ editor.putString("pass", passwordView.getText().toString());
+ editor.apply();
+ infoLogin.setText(R.string.txtInfoLoginOk);
+
+ setResult(RESULT_OK, new Intent());
+ finish();
+ }
+ Utils.hideKeyboard(context);
+ }
+
+ @Override
+ public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, byte[] responseBody, Throwable error) {
+ Toast.makeText(context, context.getString(R.string.errorWeb), Toast.LENGTH_LONG).show();
+ lt.error();
+ Utils.hideKeyboard(context);
+ }
+
+ @Override
+ public void onFinish() {
+ super.onFinish();
+ save.setClickable(true);
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/MainActivity.java b/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/MainActivity.java
index 84da151373e5..3b0734262491 100644
--- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/MainActivity.java
+++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/views/MainActivity.java
@@ -18,6 +18,7 @@
import android.view.MenuItem;
import android.view.View;
import android.widget.CompoundButton;
+
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.mikepenz.fastadapter.utils.RecyclerViewCacheUtil;
@@ -43,11 +44,12 @@
import openfoodfacts.github.scrachx.openfood.fragments.HomeFragment;
import openfoodfacts.github.scrachx.openfood.fragments.OfflineEditFragment;
import openfoodfacts.github.scrachx.openfood.fragments.SearchProductsFragment;
-import openfoodfacts.github.scrachx.openfood.fragments.UserFragment;
import openfoodfacts.github.scrachx.openfood.utils.Utils;
public class MainActivity extends BaseActivity {
+ private static final int LOGIN_REQUEST = 1;
+
private AccountHeader headerResult = null;
private Drawer result = null;
@Bind(R.id.toolbar) Toolbar toolbar;
@@ -57,11 +59,7 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
- final SharedPreferences settings = getSharedPreferences("login", 0);
- String loginS = settings.getString("user", "");
- if(loginS.isEmpty()) loginS = getResources().getString(R.string.txt_anonymous);
-
- final IProfile profile = new ProfileDrawerItem().withName(loginS).withIcon(R.drawable.img_home).withIdentifier(100);
+ final IProfile profile = getProfile();
toolbar.setTitleTextColor(getResources().getColor(R.color.white));
setSupportActionBar(toolbar);
@@ -140,8 +138,8 @@ public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
startActivity(intent);
}
} else if (drawerItem.getIdentifier() == 5) {
- fragment = new UserFragment();
- getSupportActionBar().setTitle(R.string.sign_in_drawer);
+ Intent intent = new Intent(MainActivity.this, LoginActivity.class);
+ startActivityForResult(intent, LOGIN_REQUEST);
} else if (drawerItem.getIdentifier() == 6) {
fragment = new AlertUserFragment();
getSupportActionBar().setTitle(R.string.alert_drawer);
@@ -184,6 +182,13 @@ public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
}
}
+ private IProfile getProfile() {
+ final SharedPreferences settings = getSharedPreferences("login", 0);
+ String loginS = settings.getString("user", getResources().getString(R.string.txt_anonymous));
+
+ return new ProfileDrawerItem().withName(loginS).withIcon(R.drawable.img_home).withIdentifier(100);
+ }
+
private OnCheckedChangeListener onCheckedChangeListener = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(IDrawerItem drawerItem, CompoundButton buttonView, boolean isChecked) {
@@ -195,6 +200,20 @@ public void onCheckedChanged(IDrawerItem drawerItem, CompoundButton buttonView,
}
};
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch (requestCode) {
+ case LOGIN_REQUEST:
+ if (resultCode == RESULT_OK) {
+ this.headerResult.setActiveProfile(getProfile());
+ }
+ break;
+ default:
+ // do nothing
+ break;
+ }
+ }
+
@Override
protected void onSaveInstanceState(Bundle outState) {
//add the values which need to be saved from the drawer to the bundle
@@ -262,7 +281,7 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which)
})
.show();
}
- return;
+ break;
}
}
}
diff --git a/app/src/main/res/layout/fragment_user.xml b/app/src/main/res/layout/activity_login.xml
similarity index 100%
rename from app/src/main/res/layout/fragment_user.xml
rename to app/src/main/res/layout/activity_login.xml
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5f962de8dc11..5e2df34044ae 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -172,4 +172,8 @@
- 1
+
+ The password needs to be a least 6 characters long.
+ This field is required
+