pull/42/head
parent
03f3a3c3fa
commit
d6e50f8284
@ -1,226 +0,0 @@ |
|||||||
package io.legado.app.ui.filechooser.utils; |
|
||||||
|
|
||||||
import androidx.annotation.IntDef; |
|
||||||
import androidx.annotation.NonNull; |
|
||||||
|
|
||||||
import java.lang.annotation.Retention; |
|
||||||
import java.lang.annotation.RetentionPolicy; |
|
||||||
import java.text.ParseException; |
|
||||||
import java.text.SimpleDateFormat; |
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.Calendar; |
|
||||||
import java.util.Date; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Locale; |
|
||||||
|
|
||||||
/** |
|
||||||
* 日期时间工具类 |
|
||||||
* |
|
||||||
* @author 李玉江[QQ:1023694760] |
|
||||||
* @since 2015/8/5 |
|
||||||
*/ |
|
||||||
public class DateUtils extends android.text.format.DateUtils { |
|
||||||
public static final int Second = 0; |
|
||||||
public static final int Minute = 1; |
|
||||||
public static final int Hour = 2; |
|
||||||
public static final int Day = 3; |
|
||||||
|
|
||||||
@IntDef(value = {Second, Minute, Hour, Day}) |
|
||||||
@Retention(RetentionPolicy.SOURCE) |
|
||||||
public @interface DifferenceMode { |
|
||||||
} |
|
||||||
|
|
||||||
public static long calculateDifferentSecond(Date startDate, Date endDate) { |
|
||||||
return calculateDifference(startDate, endDate, Second); |
|
||||||
} |
|
||||||
|
|
||||||
public static long calculateDifferentMinute(Date startDate, Date endDate) { |
|
||||||
return calculateDifference(startDate, endDate, Minute); |
|
||||||
} |
|
||||||
|
|
||||||
public static long calculateDifferentHour(Date startDate, Date endDate) { |
|
||||||
return calculateDifference(startDate, endDate, Hour); |
|
||||||
} |
|
||||||
|
|
||||||
public static long calculateDifferentDay(Date startDate, Date endDate) { |
|
||||||
return calculateDifference(startDate, endDate, Day); |
|
||||||
} |
|
||||||
|
|
||||||
public static long calculateDifferentSecond(long startTimeMillis, long endTimeMillis) { |
|
||||||
return calculateDifference(startTimeMillis, endTimeMillis, Second); |
|
||||||
} |
|
||||||
|
|
||||||
public static long calculateDifferentMinute(long startTimeMillis, long endTimeMillis) { |
|
||||||
return calculateDifference(startTimeMillis, endTimeMillis, Minute); |
|
||||||
} |
|
||||||
|
|
||||||
public static long calculateDifferentHour(long startTimeMillis, long endTimeMillis) { |
|
||||||
return calculateDifference(startTimeMillis, endTimeMillis, Hour); |
|
||||||
} |
|
||||||
|
|
||||||
public static long calculateDifferentDay(long startTimeMillis, long endTimeMillis) { |
|
||||||
return calculateDifference(startTimeMillis, endTimeMillis, Day); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 计算两个时间戳之间相差的时间戳数 |
|
||||||
*/ |
|
||||||
public static long calculateDifference(long startTimeMillis, long endTimeMillis, @DifferenceMode int mode) { |
|
||||||
return calculateDifference(new Date(startTimeMillis), new Date(endTimeMillis), mode); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 计算两个日期之间相差的时间戳数 |
|
||||||
*/ |
|
||||||
public static long calculateDifference(Date startDate, Date endDate, @DifferenceMode int mode) { |
|
||||||
long[] different = calculateDifference(startDate, endDate); |
|
||||||
if (mode == Minute) { |
|
||||||
return different[2]; |
|
||||||
} else if (mode == Hour) { |
|
||||||
return different[1]; |
|
||||||
} else if (mode == Day) { |
|
||||||
return different[0]; |
|
||||||
} else { |
|
||||||
return different[3]; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static long[] calculateDifference(Date startDate, Date endDate) { |
|
||||||
return calculateDifference(endDate.getTime() - startDate.getTime()); |
|
||||||
} |
|
||||||
|
|
||||||
private static long[] calculateDifference(long differentMilliSeconds) { |
|
||||||
long secondsInMilli = 1000;//1s==1000ms
|
|
||||||
long minutesInMilli = secondsInMilli * 60; |
|
||||||
long hoursInMilli = minutesInMilli * 60; |
|
||||||
long daysInMilli = hoursInMilli * 24; |
|
||||||
long elapsedDays = differentMilliSeconds / daysInMilli; |
|
||||||
differentMilliSeconds = differentMilliSeconds % daysInMilli; |
|
||||||
long elapsedHours = differentMilliSeconds / hoursInMilli; |
|
||||||
differentMilliSeconds = differentMilliSeconds % hoursInMilli; |
|
||||||
long elapsedMinutes = differentMilliSeconds / minutesInMilli; |
|
||||||
differentMilliSeconds = differentMilliSeconds % minutesInMilli; |
|
||||||
long elapsedSeconds = differentMilliSeconds / secondsInMilli; |
|
||||||
return new long[]{elapsedDays, elapsedHours, elapsedMinutes, elapsedSeconds}; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 计算每月的天数 |
|
||||||
*/ |
|
||||||
public static int calculateDaysInMonth(int month) { |
|
||||||
return calculateDaysInMonth(0, month); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 根据年份及月份计算每月的天数 |
|
||||||
*/ |
|
||||||
public static int calculateDaysInMonth(int year, int month) { |
|
||||||
// 添加大小月月份并将其转换为list,方便之后的判断
|
|
||||||
String[] bigMonths = {"1", "3", "5", "7", "8", "10", "12"}; |
|
||||||
String[] littleMonths = {"4", "6", "9", "11"}; |
|
||||||
List<String> bigList = Arrays.asList(bigMonths); |
|
||||||
List<String> littleList = Arrays.asList(littleMonths); |
|
||||||
// 判断大小月及是否闰年,用来确定"日"的数据
|
|
||||||
if (bigList.contains(String.valueOf(month))) { |
|
||||||
return 31; |
|
||||||
} else if (littleList.contains(String.valueOf(month))) { |
|
||||||
return 30; |
|
||||||
} else { |
|
||||||
if (year <= 0) { |
|
||||||
return 29; |
|
||||||
} |
|
||||||
// 是否闰年
|
|
||||||
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { |
|
||||||
return 29; |
|
||||||
} else { |
|
||||||
return 28; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 月日时分秒,0-9前补0 |
|
||||||
*/ |
|
||||||
@NonNull |
|
||||||
public static String fillZero(int number) { |
|
||||||
return number < 10 ? "0" + number : "" + number; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 截取掉前缀0以便转换为整数 |
|
||||||
* |
|
||||||
* @see #fillZero(int) |
|
||||||
*/ |
|
||||||
public static int trimZero(@NonNull String text) { |
|
||||||
try { |
|
||||||
if (text.startsWith("0")) { |
|
||||||
text = text.substring(1); |
|
||||||
} |
|
||||||
return Integer.parseInt(text); |
|
||||||
} catch (NumberFormatException e) { |
|
||||||
return 0; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 功能:判断日期是否和当前date对象在同一天。 |
|
||||||
* 参见:http://www.cnblogs.com/myzhijie/p/3330970.html
|
|
||||||
* |
|
||||||
* @param date 比较的日期 |
|
||||||
* @return boolean 如果在返回true,否则返回false。 |
|
||||||
*/ |
|
||||||
public static boolean isSameDay(Date date) { |
|
||||||
if (date == null) { |
|
||||||
throw new IllegalArgumentException("date is null"); |
|
||||||
} |
|
||||||
Calendar nowCalendar = Calendar.getInstance(); |
|
||||||
Calendar newCalendar = Calendar.getInstance(); |
|
||||||
newCalendar.setTime(date); |
|
||||||
return (nowCalendar.get(Calendar.ERA) == newCalendar.get(Calendar.ERA) && |
|
||||||
nowCalendar.get(Calendar.YEAR) == newCalendar.get(Calendar.YEAR) && |
|
||||||
nowCalendar.get(Calendar.DAY_OF_YEAR) == newCalendar.get(Calendar.DAY_OF_YEAR)); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 将yyyy-MM-dd HH:mm:ss字符串转换成日期<br/> |
|
||||||
* |
|
||||||
* @param dateStr 时间字符串 |
|
||||||
* @param dataFormat 当前时间字符串的格式。 |
|
||||||
* @return Date 日期 ,转换异常时返回null。 |
|
||||||
*/ |
|
||||||
public static Date parseDate(String dateStr, String dataFormat) { |
|
||||||
try { |
|
||||||
SimpleDateFormat dateFormat = new SimpleDateFormat(dataFormat, Locale.PRC); |
|
||||||
Date date = dateFormat.parse(dateStr); |
|
||||||
return new Date(date.getTime()); |
|
||||||
} catch (ParseException e) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 将yyyy-MM-dd HH:mm:ss字符串转换成日期<br/> |
|
||||||
* |
|
||||||
* @param dateStr yyyy-MM-dd HH:mm:ss字符串 |
|
||||||
* @return Date 日期 ,转换异常时返回null。 |
|
||||||
*/ |
|
||||||
public static Date parseDate(String dateStr) { |
|
||||||
return parseDate(dateStr, "yyyy-MM-dd HH:mm:ss"); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 将指定的日期转换为一定格式的字符串 |
|
||||||
*/ |
|
||||||
public static String formatDate(Date date, String format) { |
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.PRC); |
|
||||||
return sdf.format(date); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 将当前日期转换为一定格式的字符串 |
|
||||||
*/ |
|
||||||
public static String formatDate(String format) { |
|
||||||
return formatDate(Calendar.getInstance(Locale.CHINA).getTime(), format); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,71 +0,0 @@ |
|||||||
package io.legado.app.ui.filechooser.utils; |
|
||||||
|
|
||||||
import android.app.Activity; |
|
||||||
import android.content.Context; |
|
||||||
import android.util.DisplayMetrics; |
|
||||||
import android.view.Window; |
|
||||||
import android.view.WindowManager; |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取屏幕宽高等信息、全屏切换、保持屏幕常亮、截屏等 |
|
||||||
* |
|
||||||
* @author liyujiang[QQ:1032694760] |
|
||||||
* @since 2015/11/26 |
|
||||||
*/ |
|
||||||
public final class ScreenUtils { |
|
||||||
private static boolean isFullScreen = false; |
|
||||||
private static DisplayMetrics dm = null; |
|
||||||
|
|
||||||
public static DisplayMetrics displayMetrics(Context context) { |
|
||||||
if (null != dm) { |
|
||||||
return dm; |
|
||||||
} |
|
||||||
DisplayMetrics dm = new DisplayMetrics(); |
|
||||||
WindowManager windowManager = (WindowManager) context |
|
||||||
.getSystemService(Context.WINDOW_SERVICE); |
|
||||||
windowManager.getDefaultDisplay().getMetrics(dm); |
|
||||||
return dm; |
|
||||||
} |
|
||||||
|
|
||||||
public static int widthPixels(Context context) { |
|
||||||
return displayMetrics(context).widthPixels; |
|
||||||
} |
|
||||||
|
|
||||||
public static int heightPixels(Context context) { |
|
||||||
return displayMetrics(context).heightPixels; |
|
||||||
} |
|
||||||
|
|
||||||
public static float density(Context context) { |
|
||||||
return displayMetrics(context).density; |
|
||||||
} |
|
||||||
|
|
||||||
public static int densityDpi(Context context) { |
|
||||||
return displayMetrics(context).densityDpi; |
|
||||||
} |
|
||||||
|
|
||||||
public static boolean isFullScreen() { |
|
||||||
return isFullScreen; |
|
||||||
} |
|
||||||
|
|
||||||
public static void toggleFullScreen(Activity activity) { |
|
||||||
Window window = activity.getWindow(); |
|
||||||
int flagFullscreen = WindowManager.LayoutParams.FLAG_FULLSCREEN; |
|
||||||
if (isFullScreen) { |
|
||||||
window.clearFlags(flagFullscreen); |
|
||||||
isFullScreen = false; |
|
||||||
} else { |
|
||||||
window.setFlags(flagFullscreen, flagFullscreen); |
|
||||||
isFullScreen = true; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 保持屏幕常亮 |
|
||||||
*/ |
|
||||||
public static void keepBright(Activity activity) { |
|
||||||
//需在setContentView前调用
|
|
||||||
int keepScreenOn = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; |
|
||||||
activity.getWindow().setFlags(keepScreenOn, keepScreenOn); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,161 +0,0 @@ |
|||||||
package io.legado.app.ui.filechooser.utils; |
|
||||||
|
|
||||||
import android.content.Context; |
|
||||||
import android.os.Environment; |
|
||||||
import android.text.TextUtils; |
|
||||||
|
|
||||||
import java.io.File; |
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
/** |
|
||||||
* 存储设备工具类 |
|
||||||
* <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> |
|
||||||
* <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
|
||||||
* |
|
||||||
* @author 李玉江[QQ:1023694760] |
|
||||||
* @since 2013-11-2 |
|
||||||
*/ |
|
||||||
public final class StorageUtils { |
|
||||||
|
|
||||||
/** |
|
||||||
* 判断外置存储是否可用 |
|
||||||
* |
|
||||||
* @return the boolean |
|
||||||
*/ |
|
||||||
public static boolean externalMounted() { |
|
||||||
String state = Environment.getExternalStorageState(); |
|
||||||
if (state.equals(Environment.MEDIA_MOUNTED)) { |
|
||||||
return true; |
|
||||||
} |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 返回以“/”结尾的内部存储根目录 |
|
||||||
*/ |
|
||||||
public static String getInternalRootPath(Context context, String type) { |
|
||||||
File file; |
|
||||||
if (TextUtils.isEmpty(type)) { |
|
||||||
file = context.getFilesDir(); |
|
||||||
} else { |
|
||||||
file = new File(FileUtils.INSTANCE.separator(context.getFilesDir().getAbsolutePath()) + type); |
|
||||||
//noinspection ResultOfMethodCallIgnored
|
|
||||||
file.mkdirs(); |
|
||||||
} |
|
||||||
String path = ""; |
|
||||||
if (file != null) { |
|
||||||
path = FileUtils.INSTANCE.separator(file.getAbsolutePath()); |
|
||||||
} |
|
||||||
return path; |
|
||||||
} |
|
||||||
|
|
||||||
public static String getInternalRootPath(Context context) { |
|
||||||
return getInternalRootPath(context, null); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 返回以“/”结尾的外部存储根目录,外置卡不可用则返回空字符串 |
|
||||||
*/ |
|
||||||
public static String getExternalRootPath(String type) { |
|
||||||
File file = null; |
|
||||||
if (externalMounted()) { |
|
||||||
file = Environment.getExternalStorageDirectory(); |
|
||||||
} |
|
||||||
if (file != null && !TextUtils.isEmpty(type)) { |
|
||||||
file = new File(file, type); |
|
||||||
//noinspection ResultOfMethodCallIgnored
|
|
||||||
file.mkdirs(); |
|
||||||
} |
|
||||||
String path = ""; |
|
||||||
if (file != null) { |
|
||||||
path = FileUtils.INSTANCE.separator(file.getAbsolutePath()); |
|
||||||
} |
|
||||||
return path; |
|
||||||
} |
|
||||||
|
|
||||||
public static String getExternalRootPath() { |
|
||||||
return getExternalRootPath(null); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 各种类型的文件的专用的保存路径,以“/”结尾 |
|
||||||
* |
|
||||||
* @return 诸如:/mnt/sdcard/Android/data/[package]/files/[type]/ |
|
||||||
*/ |
|
||||||
public static String getExternalPrivatePath(Context context, String type) { |
|
||||||
File file = null; |
|
||||||
if (externalMounted()) { |
|
||||||
file = context.getExternalFilesDir(type); |
|
||||||
} |
|
||||||
//高频触发java.lang.NullPointerException,是SD卡不可用或暂时繁忙么?
|
|
||||||
String path = ""; |
|
||||||
if (file != null) { |
|
||||||
path = FileUtils.INSTANCE.separator(file.getAbsolutePath()); |
|
||||||
} |
|
||||||
return path; |
|
||||||
} |
|
||||||
|
|
||||||
public static String getExternalPrivatePath(Context context) { |
|
||||||
return getExternalPrivatePath(context, null); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 下载的文件的保存路径,必须为外部存储,以“/”结尾 |
|
||||||
* |
|
||||||
* @return 诸如 :/mnt/sdcard/Download/ |
|
||||||
*/ |
|
||||||
public static String getDownloadPath() throws RuntimeException { |
|
||||||
File file; |
|
||||||
if (externalMounted()) { |
|
||||||
file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); |
|
||||||
} else { |
|
||||||
throw new RuntimeException("外置存储不可用!"); |
|
||||||
} |
|
||||||
return FileUtils.INSTANCE.separator(file.getAbsolutePath()); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 各种类型的文件的专用的缓存存储保存路径,优先使用外置存储,以“/”结尾 |
|
||||||
*/ |
|
||||||
public static String getCachePath(Context context, String type) { |
|
||||||
File file; |
|
||||||
if (externalMounted()) { |
|
||||||
file = context.getExternalCacheDir(); |
|
||||||
} else { |
|
||||||
file = context.getCacheDir(); |
|
||||||
} |
|
||||||
if (!TextUtils.isEmpty(type)) { |
|
||||||
file = new File(file, type); |
|
||||||
//noinspection ResultOfMethodCallIgnored
|
|
||||||
file.mkdirs(); |
|
||||||
} |
|
||||||
String path = ""; |
|
||||||
if (file != null) { |
|
||||||
path = FileUtils.INSTANCE.separator(file.getAbsolutePath()); |
|
||||||
} |
|
||||||
return path; |
|
||||||
} |
|
||||||
|
|
||||||
public static String getCachePath(Context context) { |
|
||||||
return getCachePath(context, null); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 返回以“/”结尾的临时存储目录 |
|
||||||
*/ |
|
||||||
public static String getTempDirPath(Context context) { |
|
||||||
return getExternalPrivatePath(context, "temporary"); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 返回临时存储文件路径 |
|
||||||
*/ |
|
||||||
public static String getTempFilePath(Context context) { |
|
||||||
try { |
|
||||||
return File.createTempFile("lyj_", ".tmp", context.getCacheDir()).getAbsolutePath(); |
|
||||||
} catch (IOException e) { |
|
||||||
return getTempDirPath(context) + "lyj.tmp"; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue