diff --git a/app/src/main/java/io/legado/app/ui/filechooser/utils/ConvertUtils.java b/app/src/main/java/io/legado/app/ui/filechooser/utils/ConvertUtils.java deleted file mode 100644 index e4440143f..000000000 --- a/app/src/main/java/io/legado/app/ui/filechooser/utils/ConvertUtils.java +++ /dev/null @@ -1,617 +0,0 @@ -package io.legado.app.ui.filechooser.utils; - -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.text.TextUtils; -import android.view.View; -import android.widget.ListView; -import android.widget.ScrollView; - -import androidx.annotation.ColorInt; -import androidx.annotation.FloatRange; - -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; - -/** - * 数据类型转换、单位转换 - * - * @author 李玉江[QQ:1023694760] - * @since 2014-4-18 - */ -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) { - } - 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); - 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); - 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[] toArray(List list) { - //noinspection unchecked - return (T[]) list.toArray(); - } - - public static List 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) { - } - 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) { - } - 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) { - } - } - 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) { - return ""; - } - 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(); - } - } - 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) { - } - return filePath; - } - - /** - * 把view转化为bitmap(截图) - * 参见:http://www.cnblogs.com/lee0oo0/p/3355468.html - */ - public static Bitmap toBitmap(View view) { - int width = view.getWidth(); - int height = view.getHeight(); - if (view instanceof ListView) { - height = 0; - // 获取listView实际高度 - ListView listView = (ListView) view; - for (int i = 0; i < listView.getChildCount(); i++) { - height += listView.getChildAt(i).getHeight(); - } - } else if (view instanceof ScrollView) { - height = 0; - // 获取scrollView实际高度 - ScrollView scrollView = (ScrollView) view; - for (int i = 0; i < scrollView.getChildCount(); i++) { - height += scrollView.getChildAt(i).getHeight(); - } - } - view.setDrawingCacheEnabled(true); - view.clearFocus(); - view.setPressed(false); - boolean willNotCache = view.willNotCacheDrawing(); - view.setWillNotCacheDrawing(false); - // Reset the drawing cache background color to fully transparent for the duration of this operation - int color = view.getDrawingCacheBackgroundColor(); - view.setDrawingCacheBackgroundColor(Color.WHITE);//截图去黑色背景(透明像素) - if (color != Color.WHITE) { - view.destroyDrawingCache(); - } - view.buildDrawingCache(); - Bitmap cacheBitmap = view.getDrawingCache(); - if (cacheBitmap == null) { - return null; - } - Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(bitmap); - canvas.drawBitmap(cacheBitmap, 0, 0, null); - canvas.save(); - canvas.restore(); - if (!bitmap.isRecycled()) { - bitmap.recycle(); - } - // Restore the view - view.destroyDrawingCache(); - view.setWillNotCacheDrawing(willNotCache); - view.setDrawingCacheBackgroundColor(color); - return bitmap; - } - - 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); - return pxValue; - } - - /** - * px转换为dp - */ - public static int toDp(Context context, float pxValue) { - final float scale = context.getResources().getDisplayMetrics().density; - int dpValue = (int) (pxValue / scale + 0.5f); - 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); - return spValue; - } - - public static String toGbk(String str) { - try { - return new String(str.getBytes("utf-8"), "gbk"); - } catch (UnsupportedEncodingException 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) { - } - 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; - } else { - colorString = red + green + blue; - } - return colorString; - } - - /** - * 对TextView、Button等设置不同状态时其文字颜色。 - * 参见:http://blog.csdn.net/sodino/article/details/6797821 - * Modified by liyujiang at 2015.08.13 - */ - 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); - } - -} diff --git a/app/src/main/java/io/legado/app/ui/filechooser/utils/ConvertUtils.kt b/app/src/main/java/io/legado/app/ui/filechooser/utils/ConvertUtils.kt new file mode 100644 index 000000000..0e0ae30a8 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/filechooser/utils/ConvertUtils.kt @@ -0,0 +1,131 @@ +package io.legado.app.ui.filechooser.utils + +import android.content.res.Resources +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable +import okhttp3.internal.and +import java.io.BufferedReader +import java.io.IOException +import java.io.InputStream +import java.io.InputStreamReader +import java.text.DecimalFormat +import java.util.* + +/** + * 数据类型转换、单位转换 + * + * @author 李玉江[QQ:1023694760] + * @since 2014-4-18 + */ +object ConvertUtils { + const val GB: Long = 1073741824 + const val MB: Long = 1048576 + const val KB: Long = 1024 + + fun toInt(obj: Any): Int { + return try { + Integer.parseInt(obj.toString()) + } catch (e: NumberFormatException) { + -1 + } + + } + + fun toInt(bytes: ByteArray): Int { + var result = 0 + var abyte: Byte + for (i in bytes.indices) { + abyte = bytes[i] + result += abyte and 0xFF shl 8 * i + } + return result + } + + fun toFloat(obj: Any): Float { + return try { + java.lang.Float.parseFloat(obj.toString()) + } catch (e: NumberFormatException) { + -1f + } + } + + fun toString(objects: Array): String { + return Arrays.deepToString(objects) + } + + fun toString(objects: Array, tag: String): String { + val sb = StringBuilder() + for (`object` in objects) { + sb.append(`object`) + sb.append(tag) + } + return sb.toString() + } + + @JvmOverloads + fun toBitmap(bytes: ByteArray, width: Int = -1, height: Int = -1): Bitmap? { + var bitmap: Bitmap? = null + if (bytes.isNotEmpty()) { + try { + val options = 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.size, options) + bitmap!!.density = 96// 96 dpi + } catch (e: Exception) { + } + + } + return bitmap + } + + fun toDrawable(bitmap: Bitmap?): Drawable? { + return if (bitmap == null) null else BitmapDrawable(Resources.getSystem(), bitmap) + } + + fun toDrawable(bytes: ByteArray): Drawable? { + return toDrawable(toBitmap(bytes)) + } + + fun toFileSizeString(fileSize: Long): String { + val df = DecimalFormat("0.00") + val fileSizeString: String + fileSizeString = when { + fileSize < KB -> fileSize.toString() + "B" + fileSize < MB -> df.format(fileSize.toDouble() / KB) + "K" + fileSize < GB -> df.format(fileSize.toDouble() / MB) + "M" + else -> df.format(fileSize.toDouble() / GB) + "G" + } + return fileSizeString + } + + @JvmOverloads + fun toString(`is`: InputStream, charset: String = "utf-8"): String { + val sb = StringBuilder() + try { + val reader = BufferedReader(InputStreamReader(`is`, charset)) + while (true) { + val line = reader.readLine() + if (line == null) { + break + } else { + sb.append(line).append("\n") + } + } + reader.close() + `is`.close() + } catch (e: IOException) { + } + + return sb.toString() + } + +} \ No newline at end of file