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 +