diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/accounts/AbstractFragment.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/accounts/AbstractFragment.java | 306 |
1 files changed, 306 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/AbstractFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/AbstractFragment.java new file mode 100644 index 000000000..d68fced44 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/AbstractFragment.java @@ -0,0 +1,306 @@ +package org.wordpress.android.ui.accounts; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.text.method.PasswordTransformationMethod; +import android.view.KeyEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.ImageView; + +import com.android.volley.RequestQueue; +import com.android.volley.VolleyError; +import com.android.volley.toolbox.Volley; +import com.wordpress.rest.RestRequest; + +import org.json.JSONException; +import org.json.JSONObject; +import org.wordpress.android.R; +import org.wordpress.android.networking.RestClientUtils; +import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.AppLog.T; +import org.wordpress.android.util.WPActivityUtils; + +/** + * A fragment representing a single step in a wizard. The fragment shows a dummy title indicating + * the page number, along with some dummy text. + */ +public abstract class AbstractFragment extends Fragment { + protected static RequestQueue requestQueue; + protected static RestClientUtils mRestClientUtils; + protected ConnectivityManager mSystemService; + protected boolean mPasswordVisible; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mSystemService = (ConnectivityManager) getActivity().getApplicationContext(). + getSystemService(Context.CONNECTIVITY_SERVICE); + if (requestQueue == null) { + requestQueue = Volley.newRequestQueue(getActivity()); + } + } + + protected RestClientUtils getRestClientUtils() { + if (mRestClientUtils == null) { + mRestClientUtils = new RestClientUtils(getContext(), requestQueue, null, null); + } + return mRestClientUtils; + } + + protected void startProgress(String message) { + } + + protected void updateProgress(String message) { + } + + protected void endProgress() { + } + + protected abstract void onDoneAction(); + + protected abstract boolean isUserDataValid(); + + protected boolean onDoneEvent(int actionId, KeyEvent event) { + if (didPressEnterKey(actionId, event)) { + if (!isUserDataValid()) { + return true; + } + + // hide keyboard before calling the done action + View view = getActivity().getCurrentFocus(); + if (view != null) WPActivityUtils.hideKeyboard(view); + + // call child action + onDoneAction(); + return true; + } + return false; + } + + protected boolean didPressNextKey(int actionId, KeyEvent event) { + return actionId == EditorInfo.IME_ACTION_NEXT || event != null && (event.getAction() == KeyEvent.ACTION_DOWN + && event.getKeyCode() == KeyEvent.KEYCODE_NAVIGATE_NEXT); + } + + protected boolean didPressEnterKey(int actionId, KeyEvent event) { + return actionId == EditorInfo.IME_ACTION_DONE || event != null && (event.getAction() == KeyEvent.ACTION_DOWN + && event.getKeyCode() == KeyEvent.KEYCODE_ENTER); + } + + protected void initPasswordVisibilityButton(View rootView, final EditText passwordEditText) { + final ImageView passwordVisibility = (ImageView) rootView.findViewById(R.id.password_visibility); + if (passwordVisibility == null) { + return; + } + passwordVisibility.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + mPasswordVisible = !mPasswordVisible; + if (mPasswordVisible) { + passwordVisibility.setImageResource(R.drawable.dashicon_eye_open); + passwordVisibility.setColorFilter(v.getContext().getResources().getColor(R.color.nux_eye_icon_color_open)); + passwordEditText.setTransformationMethod(null); + } else { + passwordVisibility.setImageResource(R.drawable.dashicon_eye_closed); + passwordVisibility.setColorFilter(v.getContext().getResources().getColor(R.color.nux_eye_icon_color_closed)); + passwordEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); + } + passwordEditText.setSelection(passwordEditText.length()); + } + }); + } + + protected boolean specificShowError(int messageId) { + return false; + } + + protected void showError(int messageId) { + if (!isAdded()) { + return; + } + if (specificShowError(messageId)) { + return; + } + // Failback if it's not a specific error + showError(getString(messageId)); + } + + protected void showError(String message) { + if (!isAdded()) { + return; + } + FragmentTransaction ft = getFragmentManager().beginTransaction(); + SignInDialogFragment nuxAlert = SignInDialogFragment.newInstance(getString(R.string.error), message, + R.drawable.noticon_alert_big, getString(R.string.nux_tap_continue)); + ft.add(nuxAlert, "alert"); + ft.commitAllowingStateLoss(); + } + + protected ErrorType getErrorType(int messageId) { + if (messageId == R.string.username_only_lowercase_letters_and_numbers || + messageId == R.string.username_required || messageId == R.string.username_not_allowed || + messageId == R.string.username_must_be_at_least_four_characters || + messageId == R.string.username_contains_invalid_characters || + messageId == R.string.username_must_include_letters || messageId == R.string.username_exists || + messageId == R.string.username_reserved_but_may_be_available || + messageId == R.string.username_invalid) { + return ErrorType.USERNAME; + } else if (messageId == R.string.password_invalid) { + return ErrorType.PASSWORD; + } else if (messageId == R.string.email_cant_be_used_to_signup || messageId == R.string.email_invalid || + messageId == R.string.email_not_allowed || messageId == R.string.email_exists || + messageId == R.string.email_reserved) { + return ErrorType.EMAIL; + } else if (messageId == R.string.blog_name_required || messageId == R.string.blog_name_not_allowed || + messageId == R.string.blog_name_must_be_at_least_four_characters || + messageId == R.string.blog_name_must_be_less_than_sixty_four_characters || + messageId == R.string.blog_name_contains_invalid_characters || + messageId == R.string.blog_name_cant_be_used || + messageId == R.string.blog_name_only_lowercase_letters_and_numbers || + messageId == R.string.blog_name_must_include_letters || messageId == R.string.blog_name_exists || + messageId == R.string.blog_name_reserved || + messageId == R.string.blog_name_reserved_but_may_be_available || + messageId == R.string.blog_name_invalid) { + return ErrorType.SITE_URL; + } else if (messageId == R.string.blog_title_invalid) { + return ErrorType.TITLE; + } + return ErrorType.UNDEFINED; + } + + protected int getErrorMessageForErrorCode(String errorCode) { + if (errorCode.equals("username_only_lowercase_letters_and_numbers")) { + return R.string.username_only_lowercase_letters_and_numbers; + } + if (errorCode.equals("username_required")) { + return R.string.username_required; + } + if (errorCode.equals("username_not_allowed")) { + return R.string.username_not_allowed; + } + if (errorCode.equals("email_cant_be_used_to_signup")) { + return R.string.email_cant_be_used_to_signup; + } + if (errorCode.equals("username_must_be_at_least_four_characters")) { + return R.string.username_must_be_at_least_four_characters; + } + if (errorCode.equals("username_contains_invalid_characters")) { + return R.string.username_contains_invalid_characters; + } + if (errorCode.equals("username_must_include_letters")) { + return R.string.username_must_include_letters; + } + if (errorCode.equals("email_invalid")) { + return R.string.email_invalid; + } + if (errorCode.equals("email_not_allowed")) { + return R.string.email_not_allowed; + } + if (errorCode.equals("username_exists")) { + return R.string.username_exists; + } + if (errorCode.equals("email_exists")) { + return R.string.email_exists; + } + if (errorCode.equals("username_reserved_but_may_be_available")) { + return R.string.username_reserved_but_may_be_available; + } + if (errorCode.equals("email_reserved")) { + return R.string.email_reserved; + } + if (errorCode.equals("blog_name_required")) { + return R.string.blog_name_required; + } + if (errorCode.equals("blog_name_not_allowed")) { + return R.string.blog_name_not_allowed; + } + if (errorCode.equals("blog_name_must_be_at_least_four_characters")) { + return R.string.blog_name_must_be_at_least_four_characters; + } + if (errorCode.equals("blog_name_must_be_less_than_sixty_four_characters")) { + return R.string.blog_name_must_be_less_than_sixty_four_characters; + } + if (errorCode.equals("blog_name_contains_invalid_characters")) { + return R.string.blog_name_contains_invalid_characters; + } + if (errorCode.equals("blog_name_cant_be_used")) { + return R.string.blog_name_cant_be_used; + } + if (errorCode.equals("blog_name_only_lowercase_letters_and_numbers")) { + return R.string.blog_name_only_lowercase_letters_and_numbers; + } + if (errorCode.equals("blog_name_must_include_letters")) { + return R.string.blog_name_must_include_letters; + } + if (errorCode.equals("blog_name_exists")) { + return R.string.blog_name_exists; + } + if (errorCode.equals("blog_name_reserved")) { + return R.string.blog_name_reserved; + } + if (errorCode.equals("blog_name_reserved_but_may_be_available")) { + return R.string.blog_name_reserved_but_may_be_available; + } + if (errorCode.equals("password_invalid")) { + return R.string.password_invalid; + } + if (errorCode.equals("blog_name_invalid")) { + return R.string.blog_name_invalid; + } + if (errorCode.equals("blog_title_invalid")) { + return R.string.blog_title_invalid; + } + if (errorCode.equals("username_invalid")) { + return R.string.username_invalid; + } + return 0; + } + + protected enum ErrorType {USERNAME, PASSWORD, SITE_URL, EMAIL, TITLE, UNDEFINED} + + public class ErrorListener implements RestRequest.ErrorListener { + @Override + public void onErrorResponse(VolleyError error) { + String message = null; + int messageId; + AppLog.e(T.NUX, error); + if (error.networkResponse != null && error.networkResponse.data != null) { + AppLog.e(T.NUX, String.format("Error message: %s", new String(error.networkResponse.data))); + String jsonString = new String(error.networkResponse.data); + try { + JSONObject errorObj = new JSONObject(jsonString); + messageId = getErrorMessageForErrorCode((String) errorObj.get("error")); + if (messageId == 0) { + // Not one of our common errors. Show the error message from the server. + message = (String) errorObj.get("message"); + } + } catch (JSONException e) { + AppLog.e(T.NUX, e); + messageId = R.string.error_generic; + } + } else { + if (error.getMessage() != null) { + if (error.getMessage().contains("Limit reached")) { + messageId = R.string.limit_reached; + } else { + messageId = R.string.error_generic; + } + } else { + messageId = R.string.error_generic; + } + } + endProgress(); + if (messageId == 0) { + showError(message); + } else { + showError(messageId); + } + } + } +} |