package org.softeg.slartus.forpdaplus; import android.content.Context; import android.graphics.Bitmap; import android.os.AsyncTask; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.Toast; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; import org.softeg.slartus.forpdaapi.ProfileApi; import org.softeg.slartus.forpdaapi.classes.LoginForm; import org.softeg.slartus.forpdaplus.common.AppLog; /** * User: slinkin * Date: 08.02.12 * Time: 7:18 */ public class LoginDialog { String capTime; String capSig; String session; EditText username_edit; final EditText password_edit; CheckBox privacy_checkbox; View mView; ImageView mImageView; ProgressBar mProgressBar; private Context mContext; public LoginDialog(Context context) { mContext = context; LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mView = inflater.inflate(R.layout.login, null); mImageView = (ImageView) mView.findViewById(R.id.cap_img); mProgressBar = (ProgressBar) mView.findViewById(R.id.progressBar2); username_edit = (EditText) mView.findViewById(R.id.username_edit); password_edit = (EditText) mView.findViewById(R.id.password_edit); privacy_checkbox = (CheckBox) mView.findViewById(R.id.privacy_checkbox); new CapTask().execute(); loadData(); } protected View getView() { return mView; } protected void connect(Client.OnUserChangedListener onConnectResult) { saveData(); LoginTask loginTask = new LoginTask(mContext, username_edit.getText().toString(), password_edit.getText().toString(), privacy_checkbox.isChecked(), ((EditText) mView.findViewById(R.id.cap_value_ed)).getText().toString(), capTime, capSig, session, onConnectResult); loginTask.execute(username_edit.getText().toString(), password_edit.getText().toString(), Boolean.toString(privacy_checkbox.isChecked())); } protected void saveData() { App.getInstance().getPreferences().edit() .putBoolean("LoginPrivacy", privacy_checkbox.isChecked()) .putString("Login", username_edit.getText().toString()) .apply(); } protected void loadData() { privacy_checkbox.setChecked(App.getInstance().getPreferences().getBoolean("LoginPrivacy", false)); username_edit.setText(App.getInstance().getPreferences().getString("Login", "")); } public static void showDialog(final Context context, final Client.OnUserChangedListener onConnectResult) { final LoginDialog loginDialog = new LoginDialog(context); MaterialDialog dialog = new MaterialDialog.Builder(context) .title(R.string.login) .customView(loginDialog.getView(), true) .positiveText(R.string.login) .negativeText(R.string.cancel) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { loginDialog.connect(onConnectResult); } }) .onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(MaterialDialog dialog, DialogAction which) { MainActivity.checkToster(context); MainActivity.checkUsers(context); } }) .build(); dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); dialog.show(); } public static void logout(Context context) { LogoutTask logoutTask = new LogoutTask(context); logoutTask.execute(); App.getInstance().getPreferences().edit() .putBoolean("isRecdRepImage", false) .putString("repPlusImage", "http://s.4pda.to/ShmfPSURw3VD2aNlTerb3hvYwGCMxd4z0muJ.gif") .apply(); } public class CapTask extends AsyncTask<String, Void, LoginForm> { public CapTask() { } @Override protected LoginForm doInBackground(String... params) { try { return ProfileApi.getLoginForm(Client.getInstance()); } catch (Exception e) { LoginForm loginForm = new LoginForm(); loginForm.setError(e); return loginForm; } } // can use UI thread here protected void onPreExecute() { mView.findViewById(R.id.progressBar2).setVisibility(View.VISIBLE); } protected void onCancelled() { Toast.makeText(mContext, R.string.canceled, Toast.LENGTH_SHORT).show(); } // can use UI thread here protected void onPostExecute(final LoginForm loginForm) { if (loginForm.getError() == null) { ImageLoader.getInstance().displayImage(loginForm.getCapPath(), mImageView, new SimpleImageLoadingListener(){ @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { Toast.makeText(mContext, R.string.failed_load_captcha, Toast.LENGTH_SHORT).show(); mProgressBar.setVisibility(View.GONE); } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { mProgressBar.setVisibility(View.GONE); } }); capTime = loginForm.getCapTime(); capSig = loginForm.getCapSig(); session = loginForm.getSession(); } else { AppLog.e(mContext, loginForm.getError()); } } } public static class LoginTask extends AsyncTask<String, Void, Boolean> { Context mContext; private final MaterialDialog dialog; private String login; private String password; private Boolean privacy; private String capVal; private String capTime; private String capSig; private String session; private Client.OnUserChangedListener m_OnConnectResult; public LoginTask(Context context, String login, String password, Boolean privacy, String capVal, String capTime, String capSig, String session, Client.OnUserChangedListener onConnectResult) { mContext = context; this.login = login; this.password = password; this.privacy = privacy; this.capVal = capVal; this.capTime = capTime; this.capSig = capSig; this.session = session; m_OnConnectResult = onConnectResult; dialog = new MaterialDialog.Builder(mContext) .progress(true, 0) .cancelable(false) .content(R.string.performing_login) .build(); } @Override protected Boolean doInBackground(String... params) { try { return Client.getInstance().login(login, password, privacy, capVal, capTime, capSig, session); } catch (Exception e) { ex = e; return false; } } // can use UI thread here protected void onPreExecute() { this.dialog.show(); } protected void onCancelled() { Toast.makeText(mContext, R.string.canceled, Toast.LENGTH_SHORT).show(); } private Exception ex; private void doOnUserChangedListener(String user, Boolean success) { if (m_OnConnectResult != null) m_OnConnectResult.onUserChanged(user, success); } // can use UI thread here protected void onPostExecute(final Boolean success) { if (this.dialog.isShowing()) { this.dialog.dismiss(); } doOnUserChangedListener(login, success); Client.getInstance().doOnUserChangedListener(login, success); App.getInstance().getPreferences().edit().putBoolean("needLoadRepImage", success).apply(); if (success) { Toast.makeText(mContext, R.string.login_performed, Toast.LENGTH_SHORT).show(); MainActivity.checkToster(mContext); MainActivity.checkUsers(mContext); } else { if (ex != null) AppLog.e(mContext, ex); else new MaterialDialog.Builder(mContext) .title(R.string.error) .content(Client.getInstance().getLoginFailedReason()) .positiveText(R.string.ok) .show(); } } } public static class LogoutTask extends AsyncTask<String, Void, Boolean> { Context mContext; private final MaterialDialog dialog; public LogoutTask(Context context) { mContext = context; dialog = new MaterialDialog.Builder(mContext) .progress(true, 0) .cancelable(true) .content(R.string.performing_logout) .build(); } private String m_Login; private String m_Password; private Boolean m_LoginRemember; private Boolean m_AutoLogin; @Override protected Boolean doInBackground(String... params) { try { return Client.getInstance().logout(); } catch (Throwable e) { AppLog.e(mContext, e); ex = e; return false; } } // can use UI thread here protected void onPreExecute() { this.dialog.show(); } protected void onCancelled() { Toast.makeText(mContext, R.string.canceled, Toast.LENGTH_SHORT).show(); } private Throwable ex; private void doOnUserChangedListener(String user, Boolean success) { } // can use UI thread here protected void onPostExecute(final Boolean success) { if (this.dialog.isShowing()) { this.dialog.dismiss(); } doOnUserChangedListener(m_Login, success); App.getInstance().getPreferences().edit().putBoolean("needLoadRepImage", !success).apply(); if (success) { Toast.makeText(mContext, R.string.logout_performed, Toast.LENGTH_SHORT).show(); } else { if (ex != null) AppLog.i(mContext, ex); } } } }