content: package cn.addapp.pickers.util;
  
  import android.annotation.TargetApi;
  import android.content.ContentUris;
  import android.content.Context;
  import android.content.res.ColorStateList;
  import android.content.res.Resources;
  import android.database.Cursor;
  import android.graphics.Bitmap;
  import android.graphics.BitmapFactory;
  import android.graphics.Canvas;
  import android.graphics.Color;
  import android.graphics.drawable.BitmapDrawable;
  import android.graphics.drawable.ColorDrawable;
  import android.graphics.drawable.Drawable;
  import android.graphics.drawable.NinePatchDrawable;
  import android.net.Uri;
  import android.os.Build;
  import android.os.Environment;
  import android.provider.DocumentsContract;
  import android.provider.MediaStore;
  import android.support.annotation.ColorInt;
  import android.support.annotation.FloatRange;
  import android.text.TextUtils;
  import android.util.TypedValue;
  import android.view.View;
  import android.widget.ListView;
  import android.widget.ScrollView;
  
  import java.io.BufferedReader;
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.io.UnsupportedEncodingException;
  import java.nio.ByteBuffer;
  import java.text.DecimalFormat;
  import java.util.Arrays;
  import java.util.List;
  import java.util.Locale;
  
  /**
   * 数据类型转换、单位转换
   * @author matt
   * blog: addapp.cn
   */
  public class ConvertUtils {
      public static final long GB = 1073741824;
      public static final long MB = 1048576;
      public static final long KB = 1024;
  
      public static int toInt(Object obj) {
          try {
              return Integer.parseInt(obj.toString());
          } catch (NumberFormatException e) {
              return -1;
          }
      }
  
      public static int toInt(byte[] bytes) {
          int result = 0;
          byte abyte;
          for (int i = 0; i < bytes.length; i++) {
              abyte = bytes[i];
              result += (abyte & 0xFF) << (8 * i);
          }
          return result;
      }
  
      public static int toShort(byte first, byte second) {
          return (first << 8) + (second & 0xFF);
      }
  
      public static long toLong(Object obj) {
          try {
              return Long.parseLong(obj.toString());
          } catch (NumberFormatException e) {
              return -1L;
          }
      }
  
      public static float toFloat(Object obj) {
          try {
              return Float.parseFloat(obj.toString());
          } catch (NumberFormatException e) {
              return -1f;
          }
      }
  
      /**
       * int占4字节
       *
       * @param i the
       * @return byte [ ]
       */
      public static byte[] toByteArray(int i) {
          // byte[] bytes = new byte[4];
          // bytes[0] = (byte) (0xff & i);
          // bytes[1] = (byte) ((0xff00 & i) >> 8);
          // bytes[2] = (byte) ((0xff0000 & i) >> 16);
          // bytes[3] = (byte) ((0xff000000 & i) >> 24);
          // return bytes;
          return ByteBuffer.allocate(4).putInt(i).array();
      }
  
      public static byte[] toByteArray(String hexData, boolean isHex) {
          if (hexData == null || hexData.equals("")) {
              return null;
          }
          if (!isHex) {
              return hexData.getBytes();
          }
          hexData = hexData.replaceAll("\\s+", "");
          String hexDigits = "0123456789ABCDEF";
          ByteArrayOutputStream baos = new ByteArrayOutputStream(
                  hexData.length() / 2);
          // 将每2位16进制整数组装成一个字节
          for (int i = 0; i < hexData.length(); i += 2) {
              baos.write((hexDigits.indexOf(hexData.charAt(i)) << 4 | hexDigits
                      .indexOf(hexData.charAt(i + 1))));
          }
          byte[] bytes = baos.toByteArray();
          try {
              baos.close();
          } catch (IOException e) {
              LogUtils.warn(e);
          }
          return bytes;
      }
  
      public static String toHexString(String str) {
          if (TextUtils.isEmpty(str))
              return "";
          StringBuilder builder = new StringBuilder();
          byte[] bytes = str.getBytes();
          for (byte aByte : bytes) {
              builder.append(Integer.toHexString(0xFF & aByte));
              builder.append(" ");
          }
          return builder.toString();
      }
  
      /**
       * To hex string string.
       *
       * @param bytes the bytes
       * @return the string
       */
      public static String toHexString(byte... bytes) {
          char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6',
                  '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
          // 参见：http://www.oschina.net/code/snippet_116768_9019
          char[] buffer = new char[bytes.length * 2];
          for (int i = 0, j = 0; i < bytes.length; ++i) {
              int u = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];//转无符号整型
              buffer[j++] = DIGITS[u >>> 4];
              buffer[j++] = DIGITS[u & 0xf];
          }
          return new String(buffer);
      }
  
      /**
       * To hex string string.
       *
       * @param num the num
       * @return the string
       */
      public static String toHexString(int num) {
          String hexString = Integer.toHexString(num);
          LogUtils.verbose(String.format(Locale.CHINA, "%d to hex string is %s", num, hexString));
          return hexString;
      }
  
      /**
       * To binary string string.
       *
       * @param bytes the bytes
       * @return the string
       */
      public static String toBinaryString(byte... bytes) {
          char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6',
                  '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
          // 参见：http://www.oschina.net/code/snippet_116768_9019
          char[] buffer = new char[bytes.length * 8];
          for (int i = 0, j = 0; i < bytes.length; ++i) {
              int u = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];//转无符号整型
              buffer[j++] = DIGITS[(u >>> 7) & 0x1];
              buffer[j++] = DIGITS[(u >>> 6) & 0x1];
              buffer[j++] = DIGITS[(u >>> 5) & 0x1];
              buffer[j++] = DIGITS[(u >>> 4) & 0x1];
              buffer[j++] = DIGITS[(u >>> 3) & 0x1];
              buffer[j++] = DIGITS[(u >>> 2) & 0x1];
              buffer[j++] = DIGITS[(u >>> 1) & 0x1];
              buffer[j++] = DIGITS[u & 0x1];
          }
          return new String(buffer);
      }
  
      /**
       * To binary string string.
       *
       * @param num the num
       * @return the string
       */
      public static String toBinaryString(int num) {
          String binaryString = Integer.toBinaryString(num);
          LogUtils.verbose(String.format(Locale.CHINA, "%d to binary string is %s", num, binaryString));
          return binaryString;
      }
  
      public static String toSlashString(String str) {
          String result = "";
          char[] chars = str.toCharArray();
          for (char chr : chars) {
              if (chr == '"' || chr == '\'' || chr == '\\') {
                  result += "\\";//符合“"”“'”“\”这三个符号的前面加一个“\”
              }
              result += chr;
          }
          return result;
      }
  
      public static <T> T[] toArray(List<T> list) {
          //noinspection unchecked
          return (T[]) list.toArray();
      }
  
      public static <T> List<T> toList(T[] array) {
          return Arrays.asList(array);
      }
  
      public static String toString(Object[] objects) {
          return Arrays.deepToString(objects);
      }
  
      public static String toString(Object[] objects, String tag) {
          StringBuilder sb = new StringBuilder();
          for (Object object : objects) {
              sb.append(object);
              sb.append(tag);
          }
          return sb.toString();
      }
  
      public static byte[] toByteArray(InputStream is) {
          if (is == null) {
              return null;
          }
          try {
              ByteArrayOutputStream os = new ByteArrayOutputStream();
              byte[] buff = new byte[100];
              while (true) {
                  int len = is.read(buff, 0, 100);
                  if (len == -1) {
                      break;
                  } else {
                      os.write(buff, 0, len);
                  }
              }
              byte[] bytes = os.toByteArray();
              os.close();
              is.close();
              return bytes;
          } catch (IOException e) {
              LogUtils.warn(e);
          }
          return null;
      }
  
      public static byte[] toByteArray(Bitmap bitmap) {
          if (bitmap == null) {
              return null;
          }
          ByteArrayOutputStream os = new ByteArrayOutputStream();
          // 将Bitmap压缩成PNG编码，质量为100%存储，除了PNG还有很多常见格式，如jpeg等。
          bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
          byte[] bytes = os.toByteArray();
          try {
              os.close();
          } catch (IOException e) {
              LogUtils.warn(e);
          }
          return bytes;
      }
  
      public static Bitmap toBitmap(byte[] bytes, int width, int height) {
          Bitmap bitmap = null;
          if (bytes.length != 0) {
              try {
                  BitmapFactory.Options options = new BitmapFactory.Options();
                  // 不进行图片抖动处理
                  options.inDither = false;
                  // 设置让解码器以最佳方式解码
                  options.inPreferredConfig = null;
                  if (width > 0 && height > 0) {
                      options.outWidth = width;
                      options.outHeight = height;
                  }
                  bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
                  bitmap.setDensity(96);// 96 dpi
              } catch (Exception e) {
                  LogUtils.error(e);
              }
          }
          return bitmap;
      }
  
      public static Bitmap toBitmap(byte[] bytes) {
          return toBitmap(bytes, -1, -1);
      }
  
      /**
       * 将Drawable转换为Bitmap
       * 参考：http://kylines.iteye.com/blog/1660184
       */
      public static Bitmap toBitmap(Drawable drawable) {
          if (drawable instanceof BitmapDrawable) {
              return ((BitmapDrawable) drawable).getBitmap();
          } else if (drawable instanceof ColorDrawable) {
              //color
              Bitmap bitmap = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888);
              Canvas canvas = new Canvas(bitmap);
              canvas.drawColor(((ColorDrawable) drawable).getColor());
              return bitmap;
          } else if (drawable instanceof NinePatchDrawable) {
              //.9.png
              Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
                      drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
              Canvas canvas = new Canvas(bitmap);
              drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
              drawable.draw(canvas);
              return bitmap;
          }
          return null;
      }
  
      /**
       * 从第三方文件选择器获取路径。
       * 参见：http://blog.csdn.net/zbjdsbj/article/details/42387551
       */
      @TargetApi(Build.VERSION_CODES.KITKAT)
      public static String toPath(Context context, Uri uri) {
          if (uri == null) {
              LogUtils.verbose("uri is null");
              return "";
          }
          LogUtils.verbose("uri: " + uri.toString());
          String path = uri.getPath();
          String scheme = uri.getScheme();
          String authority = uri.getAuthority();
          //是否是4.4及以上版本
          boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
          // DocumentProvider
          if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
              String docId = DocumentsContract.getDocumentId(uri);
              String[] split = docId.split(":");
              String type = split[0];
              Uri contentUri = null;
              switch (authority) {
                  // ExternalStorageProvider
                  case "com.android.externalstorage.documents":
                      if ("primary".equalsIgnoreCase(type)) {
                          return Environment.getExternalStorageDirectory() + "/" + split[1];
                      }
                      break;
                  // DownloadsProvider
                  case "com.android.providers.downloads.documents":
                      contentUri = ContentUris.withAppendedId(
                              Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
                      return _queryPathFromMediaStore(context, contentUri, null, null);
                  // MediaProvider
                  case "com.android.providers.media.documents":
                      if ("image".equals(type)) {
                          contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                      } else if ("video".equals(type)) {
                          contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                      } else if ("audio".equals(type)) {
                          contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                      }
                      String selection = "_id=?";
                      String[] selectionArgs = new String[]{split[1]};
                      return _queryPathFromMediaStore(context, contentUri, selection, selectionArgs);
              }
          }
          // MediaStore (and general)
          else {
              if ("content".equalsIgnoreCase(scheme)) {
                  // Return the remote address
                  if (authority.equals("com.google.android.apps.photos.content")) {
                      return uri.getLastPathSegment();
                  }
                  return _queryPathFromMediaStore(context, uri, null, null);
              }
              // File
              else if ("file".equalsIgnoreCase(scheme)) {
                  return uri.getPath();
              }
          }
          LogUtils.verbose("uri to path: " + path);
          return path;
      }
  
      private static String _queryPathFromMediaStore(Context context, Uri uri, String selection, String[] selectionArgs) {
          String filePath = null;
          try {
              String[] projection = {MediaStore.Images.Media.DATA};
              Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
              if (cursor != null) {
                  int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                  cursor.moveToFirst();
                  filePath = cursor.getString(column_index);
                  cursor.close();
              }
          } catch (IllegalArgumentException e) {
              LogUtils.error(e);
          }
          return filePath;
      }
  
      /**
       * 把view转化为bitmap（截图）
       * 参见：http://www.cnblogs.com/lee0oo0/p/3355468.html
       */
  
      public static Drawable toDrawable(Bitmap bitmap) {
          return bitmap == null ? null : new BitmapDrawable(Resources.getSystem(), bitmap);
      }
  
      public static byte[] toByteArray(Drawable drawable) {
          return toByteArray(toBitmap(drawable));
      }
  
      public static Drawable toDrawable(byte[] bytes) {
          return toDrawable(toBitmap(bytes));
      }
  
      /**
       * dp转换为px
       */
      public static int toPx(Context context, float dpValue) {
          final float scale = context.getResources().getDisplayMetrics().density;
          int pxValue = (int) (dpValue * scale + 0.5f);
          LogUtils.verbose(dpValue + " dp == " + pxValue + " px");
          return pxValue;
      }
  
      public static int toPx(float dpValue) {
          Resources resources = Resources.getSystem();
          float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, resources.getDisplayMetrics());
          return (int) px;
      }
  
      /**
       * px转换为dp
       */
      public static int toDp(Context context, float pxValue) {
          final float scale = context.getResources().getDisplayMetrics().density;
          int dpValue = (int) (pxValue / scale + 0.5f);
          LogUtils.verbose(pxValue + " px == " + dpValue + " dp");
          return dpValue;
      }
  
      /**
       * px转换为sp
       */
      public static int toSp(Context context, float pxValue) {
          final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
          int spValue = (int) (pxValue / fontScale + 0.5f);
          LogUtils.verbose(pxValue + " px == " + spValue + " sp");
          return spValue;
      }
  
      public static String toGbk(String str) {
          try {
              return new String(str.getBytes("utf-8"), "gbk");
          } catch (UnsupportedEncodingException e) {
              LogUtils.warn(e);
              return str;
          }
      }
  
      public static String toFileSizeString(long fileSize) {
          DecimalFormat df = new DecimalFormat("0.00");
          String fileSizeString;
          if (fileSize < KB) {
              fileSizeString = fileSize + "B";
          } else if (fileSize < MB) {
              fileSizeString = df.format((double) fileSize / KB) + "K";
          } else if (fileSize < GB) {
              fileSizeString = df.format((double) fileSize / MB) + "M";
          } else {
              fileSizeString = df.format((double) fileSize / GB) + "G";
          }
          return fileSizeString;
      }
  
      public static String toString(InputStream is, String charset) {
          StringBuilder sb = new StringBuilder();
          try {
              BufferedReader reader = new BufferedReader(new InputStreamReader(is, charset));
              while (true) {
                  String line = reader.readLine();
                  if (line == null) {
                      break;
                  } else {
                      sb.append(line).append("\n");
                  }
              }
              reader.close();
              is.close();
          } catch (IOException e) {
              LogUtils.error(e);
          }
          return sb.toString();
      }
  
      public static String toString(InputStream is) {
          return toString(is, "utf-8");
      }
  
      public static int toDarkenColor(@ColorInt int color) {
          return toDarkenColor(color, 0.8f);
      }
  
      public static int toDarkenColor(@ColorInt int color, @FloatRange(from = 0f, to = 1f) float value) {
          float[] hsv = new float[3];
          Color.colorToHSV(color, hsv);
          hsv[2] *= value;//HSV指Hue、Saturation、Value，即色调、饱和度和亮度，此处表示修改亮度
          return Color.HSVToColor(hsv);
      }
  
      /**
       * 转换为6位十六进制颜色代码，不含“#”
       */
      public static String toColorString(@ColorInt int color) {
          return toColorString(color, false);
      }
  
      /**
       * 转换为6位十六进制颜色代码，不含“#”
       */
      public static String toColorString(@ColorInt int color, boolean includeAlpha) {
          String alpha = Integer.toHexString(Color.alpha(color));
          String red = Integer.toHexString(Color.red(color));
          String green = Integer.toHexString(Color.green(color));
          String blue = Integer.toHexString(Color.blue(color));
          if (alpha.length() == 1) {
              alpha = "0" + alpha;
          }
          if (red.length() == 1) {
              red = "0" + red;
          }
          if (green.length() == 1) {
              green = "0" + green;
          }
          if (blue.length() == 1) {
              blue = "0" + blue;
          }
          String colorString;
          if (includeAlpha) {
              colorString = alpha + red + green + blue;
              LogUtils.verbose(String.format(Locale.CHINA, "%d to color string is %s", color, colorString));
          } else {
              colorString = red + green + blue;
              LogUtils.verbose(String.format(Locale.CHINA, "%d to color string is %s%s%s%s, exclude alpha is %s", color, alpha, red, green, blue, colorString));
          }
          return colorString;
      }
  
      /**
       * 对TextView、Button等设置不同状态时其文字颜色。
       * 参见：http://blog.csdn.net/sodino/article/details/6797821
       */
      public static ColorStateList toColorStateList(@ColorInt int normalColor, @ColorInt int pressedColor,
                                                    @ColorInt int focusedColor, @ColorInt int unableColor) {
          int[] colors = new int[]{pressedColor, focusedColor, normalColor, focusedColor, unableColor, normalColor};
          int[][] states = new int[6][];
          states[0] = new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled};
          states[1] = new int[]{android.R.attr.state_enabled, android.R.attr.state_focused};
          states[2] = new int[]{android.R.attr.state_enabled};
          states[3] = new int[]{android.R.attr.state_focused};
          states[4] = new int[]{android.R.attr.state_window_focused};
          states[5] = new int[]{};
          return new ColorStateList(states, colors);
      }
  
      public static ColorStateList toColorStateList(@ColorInt int normalColor, @ColorInt int pressedColor) {
          return toColorStateList(normalColor, pressedColor, pressedColor, normalColor);
      }
  
  }
  