Index: mobile/android/thirdparty/org/adblockplus/browser/InputValidatorDialogPreference.java |
=================================================================== |
rename from mobile/android/thirdparty/org/adblockplus/browser/UrlInputOpenerPreference.java |
rename to mobile/android/thirdparty/org/adblockplus/browser/InputValidatorDialogPreference.java |
--- a/mobile/android/thirdparty/org/adblockplus/browser/UrlInputOpenerPreference.java |
+++ b/mobile/android/thirdparty/org/adblockplus/browser/InputValidatorDialogPreference.java |
@@ -12,71 +12,202 @@ |
* GNU General Public License for more details. |
* |
* You should have received a copy of the GNU General Public License |
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
*/ |
package org.adblockplus.browser; |
-import java.lang.ref.WeakReference; |
- |
+import android.app.AlertDialog; |
import android.content.Context; |
-import android.preference.Preference; |
+import android.os.Bundle; |
+import android.preference.EditTextPreference; |
+import android.text.Editable; |
+import android.text.InputType; |
+import android.text.TextWatcher; |
import android.util.AttributeSet; |
+import android.util.Patterns; |
+import android.view.KeyEvent; |
+import android.view.View; |
+import android.view.inputmethod.EditorInfo; |
+import android.widget.EditText; |
+import android.widget.TextView; |
+import android.widget.Toast; |
-public class UrlInputOpenerPreference extends Preference implements UrlInputDialog.UrlReadyCallback |
+import org.apache.commons.validator.routines.DomainValidator; |
+import org.mozilla.gecko.R; |
+ |
+public class InputValidatorDialogPreference extends EditTextPreference implements TextWatcher, |
+ TextView.OnEditorActionListener |
{ |
- private static WeakReference<UrlInputDialog.UrlReadyCallback> redirectUrlReadyCallback = null; |
+ |
+ public enum ValidationType |
+ { |
+ URL, DOMAIN |
+ } |
- public UrlInputOpenerPreference(Context context) |
+ private ValidationType validationType; |
+ private String errorMessage; |
+ private OnInputReadyListener onInputReadyListener; |
+ private AlertDialog alertDialog; |
+ |
+ public InputValidatorDialogPreference(Context context) |
{ |
super(context); |
+ this.init(); |
+ } |
+ |
+ public InputValidatorDialogPreference(Context context, AttributeSet attrs) |
+ { |
+ super(context, attrs); |
+ this.init(); |
} |
- public UrlInputOpenerPreference(Context context, AttributeSet attrs) |
+ public InputValidatorDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) |
+ { |
+ super(context, attrs, defStyleAttr); |
+ this.init(); |
+ } |
+ |
+ private void init() |
{ |
- super(context, attrs); |
+ // Setting defaults |
+ this.setIcon(android.R.drawable.ic_menu_add); |
+ this.setPositiveButtonText(android.R.string.ok); |
+ this.setNegativeButtonText(android.R.string.cancel); |
+ this.setValidationType(ValidationType.URL); |
+ this.setErrorMessage(R.string.abb_invalid_url); |
+ final EditText editText = this.getEditText(); |
+ editText.addTextChangedListener(this); |
+ editText.setOnEditorActionListener(this); |
+ editText.setInputType(InputType.TYPE_TEXT_VARIATION_URI); |
} |
- public UrlInputOpenerPreference(Context context, AttributeSet attrs, int defStyleAttr) |
+ @Override |
+ protected void showDialog(Bundle state) |
{ |
- super(context, attrs, defStyleAttr); |
+ super.showDialog(state); |
+ |
+ this.alertDialog = (AlertDialog) this.getDialog(); |
+ // Positive button is disabled until a valid input is entered |
+ this.setPositiveButtonEnabled(false); |
} |
- protected static synchronized void setRedirectUrlReadyCallback( |
- final UrlInputDialog.UrlReadyCallback callback) |
+ @Override |
+ protected void onDialogClosed(boolean positiveResult) |
{ |
- redirectUrlReadyCallback = new WeakReference<UrlInputDialog.UrlReadyCallback>(callback); |
+ super.onDialogClosed(positiveResult); |
+ |
+ this.alertDialog = null; |
+ if (positiveResult && this.onInputReadyListener != null) |
+ { |
+ this.onInputReadyListener.onInputReady(this.getInput()); |
+ } |
+ } |
+ |
+ @Override |
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) |
+ { |
+ // Ignored |
} |
@Override |
- protected void onAttachedToActivity() |
+ public void onTextChanged(CharSequence s, int start, int before, int count) |
{ |
- this.setPersistent(false); |
+ // Ignored |
+ } |
+ |
+ @Override |
+ public void afterTextChanged(Editable s) |
+ { |
+ this.setPositiveButtonEnabled(this.isValidInput()); |
} |
@Override |
- protected void onClick() |
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) |
{ |
- new UrlInputDialog(this.getContext(), UrlInputDialog.Type.ADD_SUBSCRIPTION, this).show(); |
+ if (actionId == EditorInfo.IME_ACTION_DONE) |
+ { |
+ if (this.isValidInput()) |
+ { |
+ this.alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick(); |
+ } |
+ else |
+ { |
+ Toast.makeText(this.getContext(), this.errorMessage, Toast.LENGTH_SHORT).show(); |
+ } |
+ return true; |
+ } |
+ return false; |
} |
@Override |
- public void callback(String url) |
+ protected void onBindView(View view) |
{ |
- try |
+ super.onBindView(view); |
+ final TextView title = (TextView) view.findViewById(android.R.id.title); |
+ if (title != null) |
{ |
- if (redirectUrlReadyCallback != null) |
- { |
- final UrlInputDialog.UrlReadyCallback callback = redirectUrlReadyCallback.get(); |
- if (callback != null) |
- { |
- callback.callback(url); |
- } |
- } |
- } |
- catch (Throwable t) |
- { |
- // we do not care |
+ title.setSingleLine(false); |
+ title.setEllipsize(null); |
} |
} |
+ |
+ public void setValidationType(ValidationType validationType) |
+ { |
+ this.validationType = validationType; |
+ } |
+ |
+ public void setErrorMessage(int msgResId) |
+ { |
+ this.setErrorMessage(this.getContext().getString(msgResId)); |
+ } |
+ |
+ public void setErrorMessage(String message) |
+ { |
+ this.errorMessage = message; |
+ } |
+ |
+ public void setOnInputReadyListener(OnInputReadyListener listener) |
+ { |
+ this.onInputReadyListener = listener; |
+ } |
+ |
+ private boolean isValidInput() |
+ { |
+ switch (this.validationType) |
+ { |
+ case DOMAIN: |
+ return this.isValidDomain(); |
+ default: |
+ return this.isValidUrl(); |
+ } |
+ } |
+ |
+ private boolean isValidDomain() |
+ { |
+ return DomainValidator.getInstance().isValid(this.getInput()); |
+ } |
+ |
+ private boolean isValidUrl() |
+ { |
+ return Patterns.WEB_URL.matcher(this.getInput()).matches(); |
+ } |
+ |
+ private String getInput() |
+ { |
+ return this.getEditText().getText().toString(); |
+ } |
+ |
+ private void setPositiveButtonEnabled(boolean enabled) |
+ { |
+ if (this.alertDialog != null) |
+ { |
+ this.alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(enabled); |
+ } |
+ } |
+ |
+ public interface OnInputReadyListener |
+ { |
+ void onInputReady(String input); |
+ } |
} |