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.support.customtabs.CustomTabsIntent; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.Log; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import net.steamcrafted.loadtoast.LoadToast; import java.io.IOException; import java.net.HttpCookie; import butterknife.BindView; import butterknife.OnClick; import okhttp3.ResponseBody; import openfoodfacts.github.scrachx.openfood.BuildConfig; import openfoodfacts.github.scrachx.openfood.R; import openfoodfacts.github.scrachx.openfood.network.OpenFoodAPIService; import openfoodfacts.github.scrachx.openfood.utils.Utils; import openfoodfacts.github.scrachx.openfood.views.customtabs.CustomTabActivityHelper; import openfoodfacts.github.scrachx.openfood.views.customtabs.CustomTabsHelper; import openfoodfacts.github.scrachx.openfood.views.customtabs.WebViewFallback; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; import retrofit2.Retrofit; /** * A login screen that offers login via login/password. * This Activity connect to the Chrome Custom Tabs Service on startup to prefetch the url. */ public class LoginActivity extends BaseActivity implements CustomTabActivityHelper.ConnectionCallback { @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.editTextLogin) EditText loginView; @BindView(R.id.editTextPass) EditText passwordView; @BindView(R.id.textInfoLogin) TextView infoLogin; @BindView(R.id.buttonSave) Button save; @BindView(R.id.buttonCreateAccount) Button signup; private OpenFoodAPIService apiClient; private CustomTabActivityHelper customTabActivityHelper; private Uri uri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); uri = Uri.parse(getString(R.string.website) + "cgi/user.pl"); // prefetch the uri customTabActivityHelper = new CustomTabActivityHelper(); customTabActivityHelper.setConnectionCallback(this); customTabActivityHelper.mayLaunchUrl(uri, null, null); signup.setEnabled(false); final SharedPreferences settings = getSharedPreferences("login", 0); String loginS = settings.getString("user", getResources().getString(R.string.txt_anonymous)); if(!loginS.equals(getResources().getString(R.string.txt_anonymous))) { new MaterialDialog.Builder(this) .title("Login") .content("Already logged in!") .neutralText(R.string.ok_button) .show(); } apiClient = new Retrofit.Builder() .baseUrl(BuildConfig.HOST) .build() .create(OpenFoodAPIService.class); } @OnClick(R.id.buttonSave) protected void attemptLogin() { String login = 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; } final LoadToast lt = new LoadToast(this); save.setClickable(false); lt.setText(getString(R.string.toast_retrieving)); lt.setBackgroundColor(getResources().getColor(R.color.blue)); lt.setTextColor(getResources().getColor(R.color.white)); lt.show(); final Activity context = this; apiClient.signIn(login, password, "Sign-in").enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { if (!response.isSuccess()) { Toast.makeText(context, context.getString(R.string.errorWeb), Toast.LENGTH_LONG).show(); lt.error(); Utils.hideKeyboard(context); return; } String htmlNoParsed = null; try { htmlNoParsed = response.body().string(); } catch (IOException e) { Log.e("LOGIN", "Unable to parse the login response page", e); } SharedPreferences.Editor editor = context.getSharedPreferences("login", 0).edit(); if (htmlNoParsed == null || 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 { // store the user session id (user_session and user_id) for (HttpCookie httpCookie : HttpCookie.parse(response.headers().get("set-cookie"))) { if (httpCookie.getDomain().equals(".openfoodfacts.org") && httpCookie.getPath().equals("/")) { String[] cookieValues = httpCookie.getValue().split("&"); for (int i = 0; i < cookieValues.length; i++) { editor.putString(cookieValues[i], cookieValues[++i]); } break; } } 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(Call<ResponseBody> call, Throwable t) { Toast.makeText(context, context.getString(R.string.errorWeb), Toast.LENGTH_LONG).show(); lt.error(); Utils.hideKeyboard(context); } }); save.setClickable(true); } @OnClick(R.id.buttonCreateAccount) protected void onCreateUser() { CustomTabsIntent customTabsIntent = CustomTabsHelper.getCustomTabsIntent(getBaseContext(), customTabActivityHelper.getSession()); CustomTabActivityHelper.openCustomTab(this, customTabsIntent, uri, new WebViewFallback()); } @Override public void onCustomTabsConnected() { signup.setEnabled(true); } @Override public void onCustomTabsDisconnected() { signup.setEnabled(false); } @Override protected void onStart() { super.onStart(); customTabActivityHelper.bindCustomTabsService(this); } @Override protected void onStop() { super.onStop(); customTabActivityHelper.unbindCustomTabsService(this); signup.setEnabled(false); } @Override protected void onDestroy() { super.onDestroy(); customTabActivityHelper.setConnectionCallback(null); } }