{ - void bindUI(View rootView); +public interface IView
{ void bindEvent(); @@ -16,9 +17,13 @@ public interface IView
{ int getOptionsMenuId(); - int getLayoutId(); - boolean useEventBus(); P newP(); + + void showProgressDialog(String msg); + + void closeProgressDialog(); + + void onRefresh(Boolean bRefresh); } diff --git a/mvp/src/main/java/cn/droidlover/xdroidmvp/mvp/LazyFragment.java b/mvp/src/main/java/cn/droidlover/xdroidmvp/mvp/LazyFragment.java deleted file mode 100644 index b3961ab..0000000 --- a/mvp/src/main/java/cn/droidlover/xdroidmvp/mvp/LazyFragment.java +++ /dev/null @@ -1,256 +0,0 @@ -package cn.droidlover.xdroidmvp.mvp; - -import android.app.Activity; -import android.content.Context; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; - -import com.trello.rxlifecycle2.components.support.RxFragment; - -import java.lang.reflect.Field; - -/** - * Created by wanglei on 2017/1/28. - */ - -public class LazyFragment extends RxFragment { - protected LayoutInflater layoutInflater; - protected Activity context; - - private View rootView; - private ViewGroup container; - - private boolean isInitReady = false; - private int isVisibleToUserState = STATE_NO_SET; - private Bundle saveInstanceState; - private boolean isLazyEnable = true; - private boolean isStart = false; - private FrameLayout layout; - - private static final int STATE_VISIBLE = 1; //用户可见 - private static final int STATE_NO_SET = -1; //未设置值 - private static final int STATE_NO_VISIBLE = 0; //用户不可见 - - private static final String TAG_ROOT_FRAMELAYOUT = "tag_root_framelayout"; - - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - this.layoutInflater = inflater; - this.container = container; - onCreateView(savedInstanceState); - if (rootView == null) - return super.onCreateView(inflater, container, savedInstanceState); - - return rootView; - } - - private void onCreateView(Bundle savedInstanceState) { - this.saveInstanceState = savedInstanceState; - boolean isVisible; - if (isVisibleToUserState == STATE_NO_SET) { - isVisible = getUserVisibleHint(); - } else { - isVisible = isVisibleToUserState == STATE_VISIBLE; - } - if (isLazyEnable) { - if (isVisible && !isInitReady) { - onCreateViewLazy(savedInstanceState); - isInitReady = true; - } else { - LayoutInflater mInflater = layoutInflater; - if (mInflater == null && context != null) { - mInflater = LayoutInflater.from(context); - } - layout = new FrameLayout(context); - layout.setTag(TAG_ROOT_FRAMELAYOUT); - - View view = getPreviewLayout(mInflater, layout); - if (view != null) { - layout.addView(view); - } - layout.setLayoutParams( - new FrameLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT)); - setContentView(layout); - } - } else { - onCreateViewLazy(savedInstanceState); - isInitReady = true; - } - } - - protected View getRealRootView() { - if (rootView != null) { - if (rootView instanceof FrameLayout - && TAG_ROOT_FRAMELAYOUT.equals(rootView.getTag())) { - return ((FrameLayout) rootView).getChildAt(0); - } - } - - return rootView; - } - - protected View getRootView() { - return rootView; - } - - protected View $(int id) { - if (rootView != null) { - return rootView.findViewById(id); - } - return null; - } - - protected void setContentView(int layoutResID) { - if (isLazyEnable && getRootView() != null && getRootView().getParent() != null) { - layout.removeAllViews(); - View view = layoutInflater.inflate(layoutResID, layout, false); - layout.addView(view); - } else { - rootView = layoutInflater.inflate(layoutResID, container, false); - } - } - - protected void setContentView(View view) { - if (isLazyEnable && getRootView() != null && getRootView().getParent() != null) { - layout.removeAllViews(); - layout.addView(view); - } else { - rootView = view; - } - } - - @Override - public void setUserVisibleHint(boolean isVisibleToUser) { - super.setUserVisibleHint(isVisibleToUser); - isVisibleToUserState = isVisibleToUser ? STATE_VISIBLE : STATE_NO_VISIBLE; - if (isVisibleToUser - && !isInitReady - && getRootView() != null) { - isInitReady = true; - onCreateViewLazy(saveInstanceState); - onResumeLazy(); - } - if (isInitReady && getRootView() != null) { - if (isVisibleToUser) { - isStart = true; - onStartLazy(); - } else { - isStart = false; - onStopLazy(); - } - } - } - - @Override - public void onResume() { - super.onResume(); - if (isInitReady) { - onResumeLazy(); - } - } - - @Override - public void onPause() { - super.onPause(); - if (isInitReady) { - onPauseLazy(); - } - } - - @Override - public void onStart() { - super.onStart(); - if (isInitReady - && !isStart - && getUserVisibleHint()) { - isStart = true; - onStartLazy(); - } - } - - @Override - public void onStop() { - super.onStop(); - if (isInitReady - && isStart - && getUserVisibleHint()) { - isStart = false; - onStopLazy(); - } - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - if (context instanceof Activity) { - this.context = (Activity) context; - } - } - - - @Override - public void onDetach() { - super.onDetach(); - context = null; - - try { - Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); - childFragmentManager.setAccessible(true); - childFragmentManager.set(this, null); - } catch (NoSuchFieldException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - - @Override - public void onDestroyView() { - super.onDestroyView(); - rootView = null; - container = null; - layoutInflater = null; - if (isInitReady) onDestoryLazy(); - isInitReady = false; - } - - protected View getPreviewLayout(LayoutInflater mInflater, FrameLayout layout) { - return null; - } - - protected void onCreateViewLazy(Bundle savedInstanceState) { - - } - - protected void onStartLazy() { - - } - - protected void onStopLazy() { - - } - - protected void onResumeLazy() { - - } - - protected void onPauseLazy() { - - } - - protected void onDestoryLazy() { - - } - - -} diff --git a/mvp/src/main/java/cn/droidlover/xdroidmvp/mvp/XActivity.java b/mvp/src/main/java/cn/droidlover/xdroidmvp/mvp/XActivity.java index faccc4d..729aef3 100644 --- a/mvp/src/main/java/cn/droidlover/xdroidmvp/mvp/XActivity.java +++ b/mvp/src/main/java/cn/droidlover/xdroidmvp/mvp/XActivity.java @@ -2,23 +2,30 @@ import android.app.Activity; import android.os.Bundle; -import android.support.annotation.Nullable; + +import androidx.annotation.Nullable; +import androidx.viewbinding.ViewBinding; + +import android.view.LayoutInflater; import android.view.Menu; -import android.view.View; import com.tbruyelle.rxpermissions2.RxPermissions; -import com.trello.rxlifecycle2.components.support.RxAppCompatActivity; -import butterknife.Unbinder; import cn.droidlover.xdroidmvp.XDroidConf; +import cn.droidlover.xdroidmvp.XDroidMvpUtill; import cn.droidlover.xdroidmvp.event.BusProvider; -import cn.droidlover.xdroidmvp.kit.KnifeKit; + +import com.trello.rxlifecycle3.components.support.RxAppCompatActivity; + +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; /** * Created by wanglei on 2016/12/29. */ -public abstract class XActivity
extends RxAppCompatActivity implements IView
{ +public abstract class XActivity
extends RxAppCompatActivity implements IView
{ private VDelegate vDelegate; private P p; @@ -26,28 +33,41 @@ public abstract class XActivity
extends RxAppCompatActivity
private RxPermissions rxPermissions;
- private Unbinder unbinder;
+ private E viewBinding;
+
+ @Override
+ public void onRefresh(Boolean bRefresh) {
+
+ }
+ protected final E getViewBinding() {
+ return viewBinding;
+ }
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
-
getP();
-
- if (getLayoutId() > 0) {
- setContentView(getLayoutId());
- bindUI(null);
- bindEvent();
+ try {
+ Class extends RxFragment implements IView {
+public abstract class XFragment extends RxFragment implements IView {
private VDelegate vDelegate;
private P p;
protected Activity context;
- private View rootView;
protected LayoutInflater layoutInflater;
private RxPermissions rxPermissions;
+ private E viewBinding;
- private Unbinder unbinder;
+ @Override
+ public void onRefresh(Boolean bRefresh) {
+
+ }
+ protected final E getViewBinding() {
+ return viewBinding;
+ }
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
layoutInflater = inflater;
- if (rootView == null && getLayoutId() > 0) {
- rootView = inflater.inflate(getLayoutId(), null);
- bindUI(rootView);
- } else {
- ViewGroup viewGroup = (ViewGroup) rootView.getParent();
+ try {
+ Class
- extends LazyFragment implements IView {
-
- private VDelegate vDelegate;
- private P p;
-
- private RxPermissions rxPermissions;
- private Unbinder unbinder;
-
- @Override
- protected void onCreateViewLazy(Bundle savedInstanceState) {
- super.onCreateViewLazy(savedInstanceState);
-
- getP();
-
- if (getLayoutId() > 0) {
- setContentView(getLayoutId());
- bindUI(getRealRootView());
- }
- if (useEventBus()) {
- BusProvider.getBus().register(this);
- }
- bindEvent();
- initData(savedInstanceState);
- }
-
- @Override
- public void bindUI(View rootView) {
- unbinder = KnifeKit.bind(this, rootView);
- }
-
- @Override
- public void bindEvent() {
-
- }
-
-
- public VDelegate getvDelegate() {
- if (vDelegate == null) {
- vDelegate = VDelegateBase.create(context);
- }
- return vDelegate;
- }
-
- protected P getP() {
- if (p == null) {
- p = newP();
- }
- if (p != null) {
- if (!p.hasV()) {
- p.attachV(this);
- }
- }
- return p;
- }
-
- @Override
- protected void onDestoryLazy() {
- super.onDestoryLazy();
- if (useEventBus()) {
- BusProvider.getBus().unregister(this);
- }
- if (getP() != null) {
- getP().detachV();
- }
- getvDelegate().destory();
-
- p = null;
- vDelegate = null;
- }
-
-
- protected RxPermissions getRxPermissions() {
- rxPermissions = new RxPermissions(getActivity());
- rxPermissions.setLogging(XDroidConf.DEV);
- return rxPermissions;
- }
-
-
- @Override
- public int getOptionsMenuId() {
- return 0;
- }
-
-
- @Override
- public boolean useEventBus() {
- return false;
- }
-
-
-}
diff --git a/mvp/src/main/java/cn/droidlover/xdroidmvp/mvp/XPresentation.java b/mvp/src/main/java/cn/droidlover/xdroidmvp/mvp/XPresentation.java
new file mode 100644
index 0000000..df81c60
--- /dev/null
+++ b/mvp/src/main/java/cn/droidlover/xdroidmvp/mvp/XPresentation.java
@@ -0,0 +1,116 @@
+package cn.droidlover.xdroidmvp.mvp;
+
+import android.app.Presentation;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.Display;
+import android.view.LayoutInflater;
+
+import androidx.viewbinding.ViewBinding;
+
+import com.tbruyelle.rxpermissions2.RxPermissions;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+import cn.droidlover.xdroidmvp.XDroidConf;
+import cn.droidlover.xdroidmvp.XDroidMvpUtill;
+import cn.droidlover.xdroidmvp.event.BusProvider;
+
+public abstract class XPresentation extends Presentation implements IView {
+ private P p;
+ private VDelegate vDelegate;
+ protected Context context;
+ private E viewBinding;
+ private RxPermissions rxPermissions;
+
+ public XPresentation(Context outerContext, Display display) {
+ super(outerContext, display);
+ this.context = outerContext;
+ }
+
+ protected RxPermissions getRxPermissions() {
+ rxPermissions = new RxPermissions(getOwnerActivity());
+ rxPermissions.setLogging(XDroidConf.DEV);
+ return rxPermissions;
+ }
+
+ public XPresentation(Context outerContext, Display display, int theme) {
+ super(outerContext, display, theme);
+ this.context = outerContext;
+ }
+
+ @Override
+ public void onRefresh(Boolean bRefresh) {
+
+ }
+
+ protected final E getViewBinding() {
+ return viewBinding;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getP();
+ try {
+ Class
+ * {
+ * "query": "Pizza",
+ * "locations": [
+ * 94043,
+ * 90210
+ * ]
+ * }
+ * @param json
+ * @return
+ */
+ private fun parseJson(json: String?): String {
+ if (null == json) {
+ return ERROR_FORMAT
+ }
+
+ try {
+ if (json.startsWith("{")) {
+ val jsonObject = JSONObject(json)
+ return jsonObject.toString(JSON_INDENT)
+ }
+ if (json.startsWith("[")) {
+ val jsonArray = JSONArray(json)
+ return jsonArray.toString(JSON_INDENT)
+ }
+ return ERROR_FORMAT
+ } catch (e: JSONException) {
+ error(this.javaClass.simpleName, e)
+ return ERROR_FORMAT
+ }
+
+ }
+
+ companion object {
+ private val ERROR_FORMAT = "unexpected format"
+ private val ERROR_LEVEL = "unexpected LoggerLevel"
+ private val JSON_INDENT = 2
+ }
+}
diff --git a/nativelogger/src/main/java/cn/jesse/nativelogger/logger/base/IFileLogger.kt b/nativelogger/src/main/java/cn/jesse/nativelogger/logger/base/IFileLogger.kt
new file mode 100644
index 0000000..28e931c
--- /dev/null
+++ b/nativelogger/src/main/java/cn/jesse/nativelogger/logger/base/IFileLogger.kt
@@ -0,0 +1,43 @@
+package cn.jesse.nativelogger.logger.base
+
+import java.util.logging.Formatter
+
+/**
+ * 文件日志管理器接口
+ *
+ * @author Jesse
+ */
+interface IFileLogger {
+
+ /**
+ * 设置文件路径, 日志格式工具, 和日志保留时间
+ *
+ * @param directory 路径
+ * @param formatter 日志格式化工具
+ * @param expiredPeriod 日志过期时间, 单位为天
+ */
+ fun setFilePathAndFormatter(directory: String, formatter: Formatter, expiredPeriod: Int)
+
+ /**
+ * 获取日志文件存放路径
+ */
+ fun logDirectory(): String
+
+ /**
+ * 获取文件日志格式化工具
+ */
+ fun fileFormatter(): Formatter
+
+ /**
+ * 获取日志过期时间
+ */
+ fun expiredPeriod(): Int
+
+ /**
+ * 压缩日志
+ *
+ * @param listener 压缩结果回调. succeed 是否成功, target 压缩包路径
+ *
+ */
+ fun zipLogs(listener: (succeed: Boolean, target: String) -> Unit)
+}
\ No newline at end of file
diff --git a/nativelogger/src/main/java/cn/jesse/nativelogger/logger/base/ILogger.kt b/nativelogger/src/main/java/cn/jesse/nativelogger/logger/base/ILogger.kt
new file mode 100644
index 0000000..df4d969
--- /dev/null
+++ b/nativelogger/src/main/java/cn/jesse/nativelogger/logger/base/ILogger.kt
@@ -0,0 +1,333 @@
+package cn.jesse.nativelogger.logger.base
+
+import cn.jesse.nativelogger.logger.LoggerLevel
+
+/**
+ * Logger 接口
+ *
+ * @author Jesse
+ */
+interface ILogger {
+
+ /**
+ * 设置日志tag
+ *
+ * @param tag TAG
+ */
+ fun setTag(tag: String)
+
+ /**
+ * 获取日志tag
+ */
+ fun tag(): String
+
+ /**
+ * 设置日志等级
+ *
+ * @param level 等级枚举
+ */
+ fun setLevel(level: LoggerLevel)
+
+ /**
+ * 判断是否可以debug
+ */
+ fun isDebugEnabled(): Boolean
+
+ /**
+ * debug 日志
+ *
+ * @param msg 信息
+ */
+ fun debug(msg: String)
+
+ /**
+ * debug 日志
+ *
+ * @param subTag 子TAG
+ * @param msg 信息
+ */
+ fun debug(subTag: String, msg: String)
+
+ /**
+ * debug 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param arg 被格式化对象
+ */
+ fun debug(subTag: String, format: String, arg: Any)
+
+ /**
+ * debug 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param argA 被格式化对象A
+ * @param argB 被格式化对象B
+ */
+ fun debug(subTag: String, format: String, argA: Any, argB: Any)
+
+ /**
+ * debug 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param arguments 可变参数组
+ */
+ fun debug(subTag: String, format: String, vararg arguments: Any)
+
+ /**
+ * debug 日志
+ *
+ * @param subTag 子TAG
+ * @param t 异常信息
+ */
+ fun debug(subTag: String, t: Throwable)
+
+ /**
+ * 判断是否可以info
+ */
+ fun isInfoEnabled(): Boolean
+
+ /**
+ * info 日志
+ *
+ * @param msg 信息
+ */
+ fun info(msg: String)
+
+ /**
+ * info 日志
+ *
+ * @param subTag 子TAG
+ * @param msg 信息
+ */
+ fun info(subTag: String, msg: String)
+
+ /**
+ * info 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param arg 被格式化对象
+ */
+ fun info(subTag: String, format: String, arg: Any)
+
+ /**
+ * info 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param argA 被格式化对象A
+ * @param argB 被格式化对象B
+ */
+ fun info(subTag: String, format: String, argA: Any, argB: Any)
+
+ /**
+ * info 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param arguments 可变参数组
+ */
+ fun info(subTag: String, format: String, vararg arguments: Any)
+
+ /**
+ * info 日志
+ *
+ * @param subTag 子TAG
+ * @param t 异常信息
+ */
+ fun info(subTag: String, t: Throwable)
+
+ /**
+ * 判断是否可以 warn
+ */
+ fun isWarnEnabled(): Boolean
+
+ /**
+ * warn 日志
+ *
+ * @param msg 信息
+ */
+ fun warn(msg: String)
+
+ /**
+ * warn 日志
+ *
+ * @param subTag 子TAG
+ * @param msg 信息
+ */
+ fun warn(subTag: String, msg: String)
+
+ /**
+ * warn 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param arg 被格式化对象
+ */
+ fun warn(subTag: String, format: String, arg: Any)
+
+ /**
+ * warn 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param arguments 可变参数组
+ */
+ fun warn(subTag: String, format: String, vararg arguments: Any)
+
+ /**
+ * warn 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param argA 被格式化对象A
+ * @param argB 被格式化对象B
+ */
+ fun warn(subTag: String, format: String, argA: Any, argB: Any)
+
+ /**
+ * warn 日志
+ *
+ * @param subTag 子TAG
+ * @param t 异常信息
+ */
+ fun warn(subTag: String, t: Throwable)
+
+ /**
+ * 判断是否可以 error
+ */
+ fun isErrorEnabled(): Boolean
+
+ /**
+ * error 日志
+ *
+ * @param msg 信息
+ */
+ fun error(msg: String)
+
+ /**
+ * error 日志
+ *
+ * @param subTag 子TAG
+ * @param msg 信息
+ */
+ fun error(subTag: String, msg: String)
+
+ /**
+ * error 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param arg 被格式化对象
+ */
+ fun error(subTag: String, format: String, arg: Any)
+
+ /**
+ * error 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param argA 被格式化对象A
+ * @param argB 被格式化对象B
+ */
+ fun error(subTag: String, format: String, argA: Any, argB: Any)
+
+ /**
+ * error 日志
+ *
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param arguments 可变参数组
+ */
+ fun error(subTag: String, format: String, vararg arguments: Any)
+
+ /**
+ * error 日志
+ *
+ * @param subTag 子TAG
+ * @param t 异常信息
+ */
+ fun error(subTag: String, t: Throwable)
+
+ /**
+ * 判断日志管理器是否开启
+ */
+ fun isEnabled(level: LoggerLevel): Boolean
+
+ /**
+ * 根据日志等级打印对应信息
+ *
+ * @param level 日志等级
+ * @param msg 日志信息
+ */
+ fun log(level: LoggerLevel, msg: String)
+
+ /**
+ * 根据日志等级打印对应信息
+ *
+ * @param level 日志等级
+ * @param subTag 子TAG
+ * @param msg 日志信息
+ */
+ fun log(level: LoggerLevel, subTag: String, msg: String)
+
+ /**
+ * 根据日志等级打印对应信息
+ *
+ * @param level 日志等级
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param arg 被格式化对象
+ */
+ fun log(level: LoggerLevel, subTag: String, format: String, arg: Any)
+
+ /**
+ * 根据日志等级打印对应信息
+ *
+ * @param level 日志等级
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param argA 被格式化对象A
+ * @param argB 被格式化对象B
+ */
+ fun log(level: LoggerLevel, subTag: String, format: String, argA: Any, argB: Any)
+
+ /**
+ * 根据日志等级打印对应信息
+ *
+ * @param level 日志等级
+ * @param subTag 子TAG
+ * @param format 日志格式化公式 eg. %s %d
+ * @param arguments 可变参数组
+ */
+ fun log(level: LoggerLevel, subTag: String, format: String, vararg arguments: Any)
+
+ /**
+ * 根据日志等级打印对应信息
+ *
+ * @param level 日志等级
+ * @param subTag 子TAG
+ * @param t 异常信息
+ */
+ fun log(level: LoggerLevel, subTag: String, t: Throwable)
+
+ /**
+ * 格式化json日志
+ *
+ * @param level 日志等级
+ * @param msg json串
+ */
+ fun json(level: LoggerLevel, msg: String)
+
+ /**
+ * 格式化json日志
+ *
+ * @param level 日志等级
+ * @param subTag 子TAG
+ * @param msg json串
+ */
+ fun json(level: LoggerLevel, subTag: String, msg: String)
+}
\ No newline at end of file
diff --git a/nativelogger/src/main/java/cn/jesse/nativelogger/util/CloseUtil.kt b/nativelogger/src/main/java/cn/jesse/nativelogger/util/CloseUtil.kt
new file mode 100644
index 0000000..b723976
--- /dev/null
+++ b/nativelogger/src/main/java/cn/jesse/nativelogger/util/CloseUtil.kt
@@ -0,0 +1,27 @@
+package cn.jesse.nativelogger.util
+
+import java.io.Closeable
+import java.io.IOException
+
+import cn.jesse.nativelogger.NLogger
+
+/**
+ * 关闭各种
+ *
+ * @author Jesse
+ */
+object CloseUtil {
+
+ /**
+ * 关闭Closeable对象
+ *
+ * @param closeable 对象
+ */
+ fun close(closeable: Closeable?) {
+ try {
+ closeable?.close()
+ } catch (e: IOException) {
+ NLogger.e("close", e)
+ }
+ }
+}
diff --git a/nativelogger/src/main/java/cn/jesse/nativelogger/util/CrashWatcher.kt b/nativelogger/src/main/java/cn/jesse/nativelogger/util/CrashWatcher.kt
new file mode 100644
index 0000000..7c2255c
--- /dev/null
+++ b/nativelogger/src/main/java/cn/jesse/nativelogger/util/CrashWatcher.kt
@@ -0,0 +1,45 @@
+package cn.jesse.nativelogger.util
+
+/**
+ * 监听全局异常, 捕获并回调
+ *
+ * @author Jesse
+ */
+class CrashWatcher private constructor() : Thread.UncaughtExceptionHandler {
+
+ private var mDefaultHandler: Thread.UncaughtExceptionHandler? = null
+ private var listener: ((thread: Thread?, ex: Throwable?) -> Unit)? = null
+
+ fun init() {
+ if (null != mDefaultHandler) {
+ return
+ }
+
+ mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler()
+ Thread.setDefaultUncaughtExceptionHandler(this)
+ }
+
+ fun setListener(listener: ((thread: Thread?, ex: Throwable?) -> Unit)?) {
+ this.listener = listener
+ }
+
+ override fun uncaughtException(t: Thread, e: Throwable) {
+ listener?.invoke(t, e)
+ }
+
+ companion object {
+ private var mInstance: CrashWatcher? = null
+
+ fun getInstance(): CrashWatcher {
+ if (null == mInstance) {
+ synchronized(CrashWatcher::class.java) {
+ if (null == mInstance) {
+ mInstance = CrashWatcher()
+ }
+ }
+ }
+
+ return mInstance!!
+ }
+ }
+}
diff --git a/nativelogger/src/main/java/cn/jesse/nativelogger/util/DateUtil.kt b/nativelogger/src/main/java/cn/jesse/nativelogger/util/DateUtil.kt
new file mode 100644
index 0000000..491bb0a
--- /dev/null
+++ b/nativelogger/src/main/java/cn/jesse/nativelogger/util/DateUtil.kt
@@ -0,0 +1,119 @@
+package cn.jesse.nativelogger.util
+
+import java.io.File
+import java.text.ParseException
+import java.text.SimpleDateFormat
+import java.util.*
+
+/**
+ * 日期工具类
+ *
+ * @author Jesse
+ */
+object DateUtil {
+ private val TEMPLATE_DATE = "yyyy-MM-dd"
+
+ /**
+ * 以yyyy-MM-dd格式获取当前时间
+ */
+ fun getCurrentDate(): String {
+ val sdf = SimpleDateFormat(TEMPLATE_DATE)
+ return sdf.format(System.currentTimeMillis())
+ }
+
+
+ fun DeleteFileDate(days: Int, file: File) {
+ var start = getCurrentDateBefor(days)
+ var end = getCurrentDate()
+ val sdf = SimpleDateFormat(TEMPLATE_DATE)
+ var dStart: Date?
+ var dEnd: Date?
+ try {
+ dStart = sdf.parse(start)
+ dEnd = sdf.parse(end)
+ val dateList = findDates(dStart!!, dEnd!!)
+ var f = file.listFiles()
+ if (f != null && !f.isEmpty())
+ for (f1 in f) {
+ var flag = false
+ for (date in dateList) {
+ if (f1.name.startsWith(sdf.format(date))) {
+ flag=true
+ }
+ }
+ if (!flag){
+ f1.delete()
+ }
+ }
+ } catch (e: ParseException) {
+ e.printStackTrace()
+ } catch (e1: Exception) {
+ e1.printStackTrace()
+ }
+ }
+
+ //JAVA获取某段时间内的所有日期
+ fun findDates(dStart: Date, dEnd: Date): List