/* * Copyright (C) 2013 Sasha Vasko <sasha at aftercode dot net> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.wifiafterconnect.html; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.jsoup.nodes.Element; import android.text.InputType; public class HtmlInput { public static final String TYPE_BUTTON = "button"; public static final String TYPE_CHECKBOX = "checkbox"; public static final String TYPE_COLOR = "color"; public static final String TYPE_DATE = "date"; public static final String TYPE_DATETIME = "datetime"; public static final String TYPE_DATETIME_LOCAL = "datetime-local"; public static final String TYPE_EMAIL = "email"; public static final String TYPE_FILE = "file"; public static final String TYPE_HIDDEN = "hidden"; public static final String TYPE_IMAGE = "image"; public static final String TYPE_MONTH = "month"; public static final String TYPE_NUMBER = "number"; public static final String TYPE_PASSWORD = "password"; public static final String TYPE_RADIO = "radio"; public static final String TYPE_RANGE = "range"; public static final String TYPE_RESET = "reset"; public static final String TYPE_SEARCH = "search"; public static final String TYPE_SUBMIT = "submit"; public static final String TYPE_TEL = "tel"; public static final String TYPE_TEXT = "text"; public static final String TYPE_TIME = "time"; public static final String TYPE_URL = "url"; public static final String TYPE_WEEK = "week"; public static final String DEFAULT_TYPE = TYPE_TEXT; public static final String CHARSET_NAME = "UTF-8"; // Empty strings if not available (except type)(see Jsoup docs : http://jsoup.org/apidocs/org/jsoup/nodes/Node.html#attr%28java.lang.String%29) private String name; private String type = DEFAULT_TYPE; private String value; private String inputClass=""; private String onClick=""; private String form=""; private String checked=""; private boolean forceHidden = false; public void setType (String type) { this.type = (type == null || type.isEmpty() ? DEFAULT_TYPE : type); } public HtmlInput (final String name, final String type, final String value) { this.name = name == null ? "" : name; setType (type); this.value = value == null ? "" : value; } public HtmlInput (Element e, boolean hidden) { name = e.attr("name"); setType (e.attr("type")); forceHidden = hidden; value = e.attr("value"); inputClass = e.attr("class"); onClick = e.attr("onClick"); form = e.attr("form"); checked = e.attr("checked"); } public HtmlInput (HtmlInput other) { name = other.name; type = other.type; forceHidden = other.forceHidden; value = other.value; inputClass = other.inputClass; onClick = other.onClick; form = other.form; checked = other.checked; } public boolean isHidden() { return forceHidden || type.equalsIgnoreCase(TYPE_HIDDEN); } public boolean isValid() { return (name != null && !name.isEmpty()); } public String getName() { return name; } public String getType() { return type; } public String getValue() { return value; } public boolean matchType(String type) { return this.type.equalsIgnoreCase(type); } public String getFormId() { return form; } public void setValue (String value) { this.value = (value == null) ? "" : value; } public String getOnClick() { return onClick; } public boolean isClass (String inputClass) { return (inputClass != null && this.inputClass.equals(inputClass)); } public StringBuilder formatPostData (StringBuilder postData) { // TODO: Using URLEncoder is probably less efficient then UriBuilder try { if (matchType (HtmlInput.TYPE_IMAGE)) { postData.append('&').append('x').append('=').append('1'); postData.append('&').append('y').append('=').append('1'); }else if (matchType (HtmlInput.TYPE_RADIO) && checked.isEmpty()) { // ignore unchecked radio buttons }else postData.append('&').append(URLEncoder.encode(name,CHARSET_NAME)).append('=').append(URLEncoder.encode(value,CHARSET_NAME)); } catch (UnsupportedEncodingException e) { // should never get here } return postData; } public int getAndroidInputType () { if (matchType (HtmlInput.TYPE_PASSWORD)) return InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD; else if (matchType (HtmlInput.TYPE_EMAIL)) return InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS; else if (matchType (TYPE_TEXT)) return InputType.TYPE_CLASS_TEXT; else if (matchType (TYPE_NUMBER)) return InputType.TYPE_CLASS_NUMBER; else if (matchType (TYPE_TEL)) return InputType.TYPE_CLASS_NUMBER; else if (matchType (TYPE_DATE)) return InputType.TYPE_CLASS_DATETIME|InputType.TYPE_DATETIME_VARIATION_DATE; else if (matchType (TYPE_DATETIME) |matchType (TYPE_DATETIME_LOCAL)) return InputType.TYPE_CLASS_DATETIME; else if (matchType (TYPE_TIME)) return InputType.TYPE_CLASS_DATETIME|InputType.TYPE_DATETIME_VARIATION_TIME; return 0; } @Override public String toString() { return "<input name=\"" + name + "\" type=\"" + (isHidden() ? TYPE_HIDDEN : type) + "\" value=\"" + value + "\" class=\"" + inputClass + "\" onClick=\"" + onClick + "\" form=\"" + form + "\" checked=\"" + checked + "\">"; } }