|
@@ -0,0 +1,270 @@
|
|
|
+package cn.org.bjca.trust.android.lib.im.common;
|
|
|
+
|
|
|
+import android.content.Context;
|
|
|
+import android.text.Editable;
|
|
|
+import android.text.TextUtils;
|
|
|
+import android.text.TextWatcher;
|
|
|
+import android.view.View;
|
|
|
+import android.widget.EditText;
|
|
|
+import android.widget.Toast;
|
|
|
+
|
|
|
+import com.google.android.material.snackbar.Snackbar;
|
|
|
+import com.google.android.material.textfield.TextInputLayout;
|
|
|
+
|
|
|
+import java.lang.reflect.Field;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+public class ToolsHelper {
|
|
|
+
|
|
|
+ public static boolean isNull(Object obj) {
|
|
|
+ if (null == obj)
|
|
|
+ return true;
|
|
|
+ String str = obj.toString();
|
|
|
+ if (str.isEmpty())
|
|
|
+ return true;
|
|
|
+ return str.equalsIgnoreCase("null");
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Long toLong(Object obj) {
|
|
|
+ if (isNull(obj))
|
|
|
+ return 0L;
|
|
|
+ try {
|
|
|
+ return Long.parseLong(obj.toString());
|
|
|
+ } catch (Exception e) {
|
|
|
+ return 0L;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static int toInt(Object obj) {
|
|
|
+ if (isNull(obj))
|
|
|
+ return 0;
|
|
|
+ try {
|
|
|
+ return Integer.parseInt(obj.toString());
|
|
|
+ } catch (Exception e) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Double toDouble(Object obj) {
|
|
|
+ if (isNull(obj))
|
|
|
+ return 0.0;
|
|
|
+ try {
|
|
|
+ return Double.parseDouble(obj.toString());
|
|
|
+ } catch (Exception e) {
|
|
|
+ return 0D;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String toString(Object obj) {
|
|
|
+ if (isNull(obj))
|
|
|
+ return "";
|
|
|
+ return obj.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 格式化json字符串
|
|
|
+ *
|
|
|
+ * @param jsonStr 需要格式化的json串
|
|
|
+ * @return 格式化后的json串
|
|
|
+ */
|
|
|
+ public static String formatJson(String jsonStr) {
|
|
|
+ if (null == jsonStr || "".equals(jsonStr)) return "";
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ char last = '\0';
|
|
|
+ char current = '\0';
|
|
|
+ int indent = 0;
|
|
|
+ for (int i = 0; i < jsonStr.length(); i++) {
|
|
|
+ last = current;
|
|
|
+ current = jsonStr.charAt(i);
|
|
|
+ //遇到{ [换行,且下一行缩进
|
|
|
+ switch (current) {
|
|
|
+ case '{':
|
|
|
+ case '[':
|
|
|
+ sb.append(current);
|
|
|
+ sb.append('\n');
|
|
|
+ indent++;
|
|
|
+ addIndentBlank(sb, indent);
|
|
|
+ break;
|
|
|
+ //遇到} ]换行,当前行缩进
|
|
|
+ case '}':
|
|
|
+ case ']':
|
|
|
+ sb.append('\n');
|
|
|
+ indent--;
|
|
|
+ addIndentBlank(sb, indent);
|
|
|
+ sb.append(current);
|
|
|
+ break;
|
|
|
+ //遇到,换行
|
|
|
+ case ',':
|
|
|
+ sb.append(current);
|
|
|
+ if (last != '\\') {
|
|
|
+ sb.append('\n');
|
|
|
+ addIndentBlank(sb, indent);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ sb.append(current);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return sb.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加space
|
|
|
+ */
|
|
|
+ private static void addIndentBlank(StringBuilder sb, int indent) {
|
|
|
+ for (int i = 0; i < indent; i++) {
|
|
|
+ sb.append('\t');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * http 请求数据返回 json 中中文字符为 unicode 编码转汉字转码
|
|
|
+ *
|
|
|
+ * @param theString
|
|
|
+ * @return 转化后的结果.
|
|
|
+ */
|
|
|
+ public static String decodeUnicode(String theString) {
|
|
|
+ char aChar;
|
|
|
+ int len = theString.length();
|
|
|
+ StringBuilder outBuffer = new StringBuilder(len);
|
|
|
+ for (int x = 0; x < len; ) {
|
|
|
+ aChar = theString.charAt(x++);
|
|
|
+ if (aChar == '\\') {
|
|
|
+ aChar = theString.charAt(x++);
|
|
|
+ if (aChar == 'u') {
|
|
|
+ int value = 0;
|
|
|
+ for (int i = 0; i < 4; i++) {
|
|
|
+ aChar = theString.charAt(x++);
|
|
|
+ switch (aChar) {
|
|
|
+ case '0':
|
|
|
+ case '1':
|
|
|
+ case '2':
|
|
|
+ case '3':
|
|
|
+ case '4':
|
|
|
+ case '5':
|
|
|
+ case '6':
|
|
|
+ case '7':
|
|
|
+ case '8':
|
|
|
+ case '9':
|
|
|
+ value = (value << 4) + aChar - '0';
|
|
|
+ break;
|
|
|
+ case 'a':
|
|
|
+ case 'b':
|
|
|
+ case 'c':
|
|
|
+ case 'd':
|
|
|
+ case 'e':
|
|
|
+ case 'f':
|
|
|
+ value = (value << 4) + 10 + aChar - 'a';
|
|
|
+ break;
|
|
|
+ case 'A':
|
|
|
+ case 'B':
|
|
|
+ case 'C':
|
|
|
+ case 'D':
|
|
|
+ case 'E':
|
|
|
+ case 'F':
|
|
|
+ value = (value << 4) + 10 + aChar - 'A';
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new IllegalArgumentException(
|
|
|
+ "Malformed \\uxxxx encoding.");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ outBuffer.append((char) value);
|
|
|
+ } else {
|
|
|
+ if (aChar == 't') {
|
|
|
+ aChar = '\t';
|
|
|
+ } else if (aChar != 'r') {
|
|
|
+ if (aChar == 'n') {
|
|
|
+ aChar = '\n';
|
|
|
+ } else if (aChar == 'f') {
|
|
|
+ aChar = '\f';
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ aChar = '\r';
|
|
|
+ }
|
|
|
+ outBuffer.append(aChar);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ outBuffer.append(aChar);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return outBuffer.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 弹出提示信息 感觉比Toast好看点 不过Toast不需要依赖view
|
|
|
+ *
|
|
|
+ * @param view 绑定一个view才能展示
|
|
|
+ * @param content 需要展示的内容
|
|
|
+ */
|
|
|
+ public static void snack(View view, CharSequence content) {
|
|
|
+ Snackbar.make(view, content, Snackbar.LENGTH_SHORT).show();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void showMessage(Context context, CharSequence content) {
|
|
|
+ Toast.makeText(context, content, Toast.LENGTH_SHORT).show();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * EditText绑定TextInputLayout,处理一下
|
|
|
+ *
|
|
|
+ * @param editText editText
|
|
|
+ * @param textInputLayout textInputLayout
|
|
|
+ */
|
|
|
+ public static void addTextChangedListener(EditText editText, TextInputLayout textInputLayout) {
|
|
|
+ editText.addTextChangedListener(new TextWatcher() {
|
|
|
+ @Override
|
|
|
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void afterTextChanged(Editable s) {
|
|
|
+ if (!TextUtils.isEmpty(textInputLayout.getError())) {//输入的时候不提示错误信息
|
|
|
+ textInputLayout.setErrorEnabled(true);
|
|
|
+ textInputLayout.setError("");
|
|
|
+ textInputLayout.setErrorEnabled(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 使用 TextInputLayout 提示错误信息
|
|
|
+ *
|
|
|
+ * @param textInputLayout TextInputLayout
|
|
|
+ * @param msg 错判的内容
|
|
|
+ */
|
|
|
+ public static void showError(TextInputLayout textInputLayout, String msg) {
|
|
|
+ textInputLayout.setErrorEnabled(true);
|
|
|
+ textInputLayout.setError(msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将Object对象里面的属性和值转化成Map对象
|
|
|
+ *
|
|
|
+ * @param obj
|
|
|
+ * @return
|
|
|
+ * @throws IllegalAccessException
|
|
|
+ */
|
|
|
+ public static <T> Map<String, T> objectToMap(Object obj) throws IllegalAccessException {
|
|
|
+ Map<String, T> map = new HashMap<>();
|
|
|
+ Class<?> clazz = obj.getClass();
|
|
|
+ for (Field field : clazz.getDeclaredFields()) {
|
|
|
+ field.setAccessible(true);
|
|
|
+ String fieldName = field.getName();
|
|
|
+ T value = (T) field.get(obj);
|
|
|
+ if (null != value)
|
|
|
+ map.put(fieldName, value);
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+}
|